2011-08-09 5 views
5

Cuando trato de asignar una cadena en una matriz de esta manera:¿Cómo asignar un valor de cadena a una matriz en numpy?

CoverageACol[0,0] = "Hello" 

me sale el siguiente error

Traceback (most recent call last): 
    File "<pyshell#19>", line 1, in <module> 
    CoverageACol[0,0] = "hello" 
ValueError: setting an array element with a sequence. 

Sin embargo, la asignación de un número entero no da lugar a un error:

CoverageACol[0,0] = 42 

CoverageACol es una matriz numpy.

Por favor ayuda! ¡Gracias!

Respuesta

11

se obtiene el error debido gama de NumPy es homogeneous, meaning it is a multidimensional table of elements all of the same type. Esto es diferente de una lista de listas multidimensional en Python "regular", donde puede tener objetos de diferentes tipos en una lista.

Python regular:

>>> CoverageACol = [[0, 1, 2, 3, 4], 
        [5, 6, 7, 8, 9]] 

>>> CoverageACol[0][0] = "hello" 

>>> CoverageACol 
    [['hello', 1, 2, 3, 4], 
    [5, 6, 7, 8, 9]] 

NumPy:

>>> from numpy import * 

>>> CoverageACol = arange(10).reshape(2,5) 

>>> CoverageACol 
    array([[0, 1, 2, 3, 4], 
      [5, 6, 7, 8, 9]]) 

>>> CoverageACol[0,0] = "Hello" 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

/home/biogeek/<ipython console> in <module>() 

ValueError: setting an array element with a sequence. 

Por lo tanto, depende de lo que quiere lograr, ¿por qué desea almacenar una cadena en una matriz llena para el resto con números? Si eso es realmente lo que quiere, se puede ajustar el tipo de datos de la matriz NumPy de cadena:

>>> CoverageACol = array(range(10), dtype=str).reshape(2,5) 

>>> CoverageACol 
    array([['0', '1', '2', '3', '4'], 
      ['5', '6', '7', '8', '9']], 
      dtype='|S1') 

>>> CoverageACol[0,0] = "Hello" 

>>> CoverageACol 
    array([['H', '1', '2', '3', '4'], 
     ['5', '6', '7', '8', '9']], 
     dtype='|S1') 

en cuenta que sólo se le asigna la primera letra Hello. Si desea que se asigne la palabra completa, debe configurar an array-protocol type string:

>>> CoverageACol = array(range(10), dtype='a5').reshape(2,5) 

>>> CoverageACol: 
    array([['0', '1', '2', '3', '4'], 
      ['5', '6', '7', '8', '9']], 
      dtype='|S5') 

>>> CoverageACol[0,0] = "Hello" 

>>> CoverageACol 
    array([['Hello', '1', '2', '3', '4'], 
      ['5', '6', '7', '8', '9']], 
      dtype='|S5') 
+1

¡Gracias por su explicación detallada! – Moose

+1

Configuración 'dtype = object' también funciona: https://stackoverflow.com/questions/14639496/python-numpy-array-of-arbitrary-length-strings –

+0

En su línea' overageACol = array (rango (10), dtype = str) .reshape (2,5) '. ¿Es posible cambiar 'dtype' a' list' o 'dict'? –

4

Es necesario configurar el data type del array:

CoverageACol = numpy.array([["a","b"],["c","d"]],dtype=numpy.dtype('a16')) 

Esto hace ConerageACol una matriz de cadenas (a) de longitud 16.

Cuestiones relacionadas