Chcę iterować po tablicy numpy i wykonać kilka obliczeń na wartościach. Jednak rzeczy nie są zgodne z oczekiwaniami. Aby pokazać, o co mi chodzi, po prostu napisałem ten kod, aby odczytać wartości z tablicy numpy i przenieść je na inną listę.

a = array([1,2,1]).reshape(-1, 1)
u = []
for i in np.nditer(a):
    print(i)
    u.append(i)
print(u)

Zgodnie z samouczkiem, nditer wskazuje na elementy i jako print(i) pokazuje, i to wartość. Jednak kiedy dołączam i do tablicy, tablica nie przechowuje wartości. Oczekiwany wynik to u = [1, 2, 1], ale wynik kodu to

1
2
1
[array(1), array(2), array(1)]

Co dokładnie oznacza array(1) i jak mogę to naprawić?

PS: Wiem, że za pomocą .tolist() mogę przekonwertować tablicę numpy na tablicę standardową. Jednak w tym kodzie chcę iterować po numpy elementów.

1
mahmood 24 styczeń 2022, 17:19
Gdybyś wydrukował typ i, zobaczyłbyś, że jest to typ <class 'numpy.ndarray'>
 – 
sagi
24 styczeń 2022, 17:24
Czy istnieje powód, dla którego zmieniłeś kształt? Z tego otrzymujesz obiekt o kształcie (3, 1), a jeśli będziesz iterować po tych elementach, otrzymasz array z jednym elementem.
 – 
Alex G
24 styczeń 2022, 17:27
Prawdziwe pytanie brzmi: dlaczego miałbyś używać np.nditer na pierwszym miejscu?
 – 
mozway
24 styczeń 2022, 17:30
Domyślnie, iteracja po tablicy wymiaru d>1 iteruje tylko przez pierwszą oś i traktuje ją jako tablicę wymiaru d-1. Zmieniasz kształt a na tablicę o kształcie (3,1), co sprawia, że ​​jest to tablica d=2, więc każda iteracja zwróci tablicę d=1. Jeśli najpierw go spłaszczysz, załatwi sprawę: for i in a.flatten(): u.append(i)
 – 
Mateo Vial
24 styczeń 2022, 17:32
@mozway: Próbowałem nditer, ponieważ widziałem to w niektórych tutorialach. W rzeczywistości nie sprawdziłem typu i i to print(i) mnie zmyliło.
 – 
mahmood
24 styczeń 2022, 17:38

2 odpowiedzi

Najlepsza odpowiedź

Jak już wyjaśniono w poprzednim pytaniu, numpy.nditer daje numery tablic. To, co pokazuje print, jest tylko reprezentacją obiektu, a nie zawartością lub typem obiektu (np. 1 i '1' mają tę samą reprezentację, a nie ten sam typ).

import numpy as np
a = np.array([1,2,1]).reshape(-1, 1)

type(next(np.nditer(a)))
# numpy.ndarray

Masz po prostu tablicę zerowymiarową:

np.array(1).shape
# ()

Nie ma potrzeby używania numpy.nditer tutaj. Jeśli naprawdę chcesz iterować wiersze swojej tablicy z pojedynczą kolumną (i nie używać tolist), użyj:

u = []
for i in a[:,0]:
    u.append(i)
u
# [1, 2, 1]
1
mozway 24 styczeń 2022, 17:28
Dodałbym również, że wywołanie ciągu na liście Pythona wywołuje metodę __repr__ na każdym elemencie w środku. W przypadku niektórych przedmiotów __str__ i __repr__ są takie same, ale tak nie jest
 – 
Riccardo Bucco
24 styczeń 2022, 17:28
1
Dzięki dodałem notkę ;)
 – 
mozway
24 styczeń 2022, 17:29

numpy.nditer faktycznie zwraca tablicę numpy. Jeśli chcesz uzyskać rzeczywistą wartość tego przedmiotu, możesz użyć wbudowanej funkcji item():

a = array([1,2,1]).reshape(-1, 1)
u = []
for i in np.nditer(a):
    u.append(i.item())
print(u)
1
sagi 24 styczeń 2022, 17:27