Как назначить строковое значение для массива в numpy? - PullRequest
8 голосов
/ 09 августа 2011

Когда я пытаюсь присвоить строку массиву следующим образом:

CoverageACol[0,0] = "Hello" 

Я получаю следующую ошибку

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

Однако, при назначении целого числа ошибка не возникает:

CoverageACol[0,0] = 42

CoverageACol является массивом NumPy.

Пожалуйста, помогите!Спасибо!

Ответы [ 2 ]

15 голосов
/ 09 августа 2011

Вы получаете ошибку, потому что массив NumPy является однородным, то есть это многомерная таблица элементов одного типа . Это отличается от многомерного списка списков в «обычном» Python, где вы можете иметь объекты различных типов в списке.

Обычный Python:

>>> 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.

Итак, это зависит от того, чего вы хотите достичь, почему вы хотите сохранить строку в массиве, заполненном для остальных числами? Если это действительно то, что вам нужно, вы можете установить тип данных массива NumPy в строку:

>>> 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')

Обратите внимание, что назначается только первая буква Hello. Если вы хотите, чтобы все слово было назначено, вам нужно установить строку типа протокола массива :

>>> 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')
6 голосов
/ 09 августа 2011

Вам необходимо установить тип данных массива :

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

Это делает ConerageACol массивом строк (а) длиной 16.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...