¿Qué significa dtype = object al crear una matriz numpy?

Estaba experimentando con matrices numpy y creé una matriz numpy de cadenas:

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

Como he leído en su guía oficial, las operaciones en una matriz numpy se propagan a elementos individuales. Así que hice esto:

 ar1 * 2 

Pero luego me sale este error:

 TypeError Traceback (most recent call last)  in () ----> 1 ar1 * 2 TypeError: unsupported operand type(s) for *: 'numpy.ndarray' and 'int' 

Pero cuando usé dtype=object

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

Al crear la matriz puedo hacer todas las operaciones.

¿Puede alguien decirme por qué está pasando esto?

Los arreglos NumPy se almacenan como bloques contiguos de memoria. Por lo general, tienen un solo tipo de datos (por ejemplo, enteros, flotadores o cadenas de longitud fija) y luego los bits en la memoria se interpretan como valores con ese tipo de datos.

Crear una matriz con dtype=object es diferente. La memoria que toma la matriz ahora está llena de punteros a objetos de Python que se almacenan en otra parte de la memoria (como una list Python es en realidad solo una lista de punteros a objetos, no los objetos en sí).

Los operadores aritméticos como * no funcionan con matrices como ar1 que tienen un tipo de datos string_ (en su lugar, hay funciones especiales; consulte a continuación). NumPy solo trata los bits de la memoria como caracteres y el operador * no tiene sentido aquí. Sin embargo, la línea

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

funciona porque ahora la matriz es una matriz de (punteros a) cadenas de Python. El operador * está bien definido para estos objetos de cadena de Python. Las nuevas cadenas de Python se crean en la memoria y se devuelve una nueva matriz de object con referencias a las nuevas cadenas.


Si tiene una matriz con string_ o unicode_ dtype y desea repetir cada cadena, puede usar np.char.multiply :

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

NumPy también tiene muchos otros métodos de cadenas vectorizadas .