2015-04-26 14 views
7

I eksperymentował z tablicami NumPy i stworzył numpy tablicę ciągów:Co oznacza dtype = obiekt podczas tworzenia tablicy numpy?

ar1 = np.array(['avinash', 'jay']) 

Jak już odczytać z ich urzędowej z przewodnikiem, operacje na tablicy numpy są propagowane do poszczególnych elementów. Więc zrobiłem to:

ar1 * 2 

Ale wtedy ten błąd:

TypeError         Traceback (most recent call last) 
<ipython-input-22-aaac6331c572> in <module>() 
----> 1 ar1 * 2 

TypeError: unsupported operand type(s) for *: 'numpy.ndarray' and 'int' 

Ale kiedy użyłem dtype=object

ar1 = np.array(['avinash', 'jay'], dtype=object) 

podczas tworzenia tablicy Jestem w stanie wykonać wszystkie operacje.

Czy ktoś może mi powiedzieć, dlaczego tak się dzieje?

Odpowiedz

9

Tablice NumPy są przechowywane jako ciągłe bloki pamięci. Zwykle mają jeden typ danych (np. Liczby całkowite, zmienne lub ciągi o stałej długości), a następnie bity w pamięci są interpretowane jako wartości o tym typie danych.

Tworzenie tablicy z dtype=object jest inne. Pamięć pobierana przez tablicę jest teraz wypełniona wskaźnikami dla obiektów Pythona, które są przechowywane w pamięci gdzie indziej (podobnie jak Python list to tak naprawdę tylko lista wskaźników do obiektów, a nie same obiekty).

Operatory arytmetyczne, takie jak *, nie działają z takimi tablicami, jak ar1, które mają typ danych string_ (zamiast tego są specjalne funkcje - patrz poniżej). NumPy właśnie przetwarza bity w pamięci jako znaki, a operator * nie ma sensu tutaj. Jednak linia działa, ponieważ teraz tablica jest tablicą ciągów znaków Python (wskazujących). Operator * jest dobrze zdefiniowany dla tych obiektów łańcuchowych w języku Python. Nowe ciągi w języku Python są tworzone w pamięci i zwracana jest nowa tablica object z odniesieniami do nowych ciągów.


Jeśli masz tablicę z string_ lub unicode_ dtype i chcą powtórzyć każdy ciąg, można użyć np.char.multiply:

In [52]: np.char.multiply(ar1, 2) 
Out[52]: array(['avinashavinash', 'jayjay'], 
     dtype='<U14') 

NumPy ma wiele innych vectorised string methods też.