Chcę obliczyć indeksowaną wagę na dużą (1000,000 x 3000) tablicę typu boolean numpy. Duża tablica boolowska zmienia się rzadko, ale wagi przychodzą w czasie zapytania i potrzebuję odpowiedzi bardzo szybko, bez kopiowania całej dużej tablicy lub rozszerzania małej tablicy wagi o rozmiar na rozmiar dużej tablicy.Skutecznie sumuje małą tablicę numpy, transmitowaną przez gigantyczną tablicę numpy?
Wynik powinien być tablicą zawierającą 1 000 000 wpisów, z których każda ma sumę wpisów w tablicy wag odpowiadającą wartościom tego wiersza True tego wiersza.
Przyjrzałem się za pomocą maskowanych tablic, ale wydaje się, że wymagają one zbudowania tablicy wag o rozmiarze równym mojej dużej tablicy boolowskiej.
Poniższy kod podaje poprawne wyniki, ale nie mogę sobie pozwolić na ten egzemplarz podczas kroku mnożenia. Mnożenie nie jest nawet konieczne, ponieważ tablica wartości jest wartością logiczną, ale przynajmniej poprawnie obsługuje nadawanie .
Jestem nowy na numpy i kocham go, ale mam zamiar porzucić to dla tego konkretnego problemu. Nauczyłem się dość numpy, aby wiedzieć, aby pozostać z dala od wszystkiego, co pętle w python.
Moim następnym krokiem będzie napisanie tej procedury w C (która ma dodatkową zaletą pozwalając mi zaoszczędzić pamięć za pomocą bitów zamiast bajtów, przez drogę.)
ile z was NumPy guru może ocalić mnie przed cythonem?
from numpy import array, multiply, sum
# Construct an example values array, alternating True and False.
# This represents four records of three attributes each:
# array([[False, True, False],
# [ True, False, True],
# [False, True, False],
# [ True, False, True]], dtype=bool)
values = array([(x % 2) for x in range(12)], dtype=bool).reshape((4,3))
# Construct example weights, one for each attribute:
# array([1, 2, 3])
weights = array(range(1, 4))
# Create expensive NEW array with the weights for the True attributes.
# Broadcast the weights array into the values array.
# array([[0, 2, 0],
# [1, 0, 3],
# [0, 2, 0],
# [1, 0, 3]])
weighted = multiply(values, weights)
# Add up the weights:
# array([2, 4, 2, 4])
answers = sum(weighted, axis=1)
print answers
# Rejected masked_array solution is too expensive (and oddly inverts
# the results):
masked = numpy.ma.array([[1,2,3]] * 4, mask=values)
Świetna robota z przykładem tego, czego potrzebujesz. – steveha