Ошибка: установка элемента массива с последовательностью. Python/Numpy
Я получаю эту ошибку при попытке присвоить массив другой позиции определенного массива.
Я делал это, прежде чем создавать простые списки и выполнять такое задание. Но Numpy быстрее, чем простые списки, и я пытался использовать его сейчас.
Проблема состоит в том, что у меня есть 2D-массив, в котором хранятся некоторые данные, и в моем коде у меня есть, например, для вычисления градиента для каждого значения позиции, поэтому я создаю другой 2D-массив, где каждая позиция хранит градиент для его значение.
import numpy as np
cols = 2
rows = 3
# This works
matrix_a = []
for i in range(rows):
matrix_a.append([0.0] * cols)
print matrix_a
matrix_a[0][0] = np.matrix([[0], [0]])
print matrix_a
# This doesn't work
matrix_b = np.zeros((rows, cols))
print matrix_b
matrix_b[0, 0] = np.matrix([[0], [0]])
Что происходит, потому что у меня есть класс, определяющий объект np.zeros((rows, cols)), который хранит информацию о некоторых данных, упрощая, например, данные изображений.
class Data2D(object):
def __init__(self, rows=200, cols=300):
self.cols = cols
self.rows = rows
# The 2D data structure
self.data = np.zeros((rows, cols))
В конкретном методе я должен вычислить градиент для этих данных, который является матрицей 2 x 2 (причина этого я бы хотел использовать ndarray, а не простой массив), и для этого я создаю еще один экземпляр этого объекта для хранения этих новых данных, в которых каждая точка (пиксель) должна сохранять свой градиент. Я использовал простые списки, которые работают, но я, хотя я мог бы получить некоторую производительность с помощью numpy.
Есть ли способ обойти это? Или лучший способ сделать такую вещь?
Я знаю, что я могу определить тип массива object, но я не знаю, могу ли я потерять производительность, делая такую вещь.
Спасибо.
Ответы
Ответ 1
Проблема в том, что matrix_b по умолчанию имеет тип float. На моей машине проверьте
matrix_b.dtype
возвращает dtype('float64')
. Чтобы создать массив numpy, который может содержать что угодно, вы можете вручную установить dtype в объект, который позволит вам поместить внутри него матрицу:
matrix_b = np.zeros((rows, cols), dtype=object)
matrix_b[0, 0] = np.matrix([[0], [0], [1]])
Ответ 2
В массив можно добавить другое измерение размера 3.
import numpy as np
cols = 2
rows = 3
matrix_b = np.zeros((rows, cols, 3))
matrix_b[0, 0] = np.array([0, 0, 1])
matrix_b[0, 0] = [0, 0, 1] #This also works
Другой вариант - установить dtype на list
, а затем вы можете установить каждый элемент в список. Но это не рекомендуется, так как вы потеряете большую часть скорости работы numpy, сделав это.
matrix_b = np.zeros((rows, cols), dtype=list)
matrix_b[0, 0] = [0, 0, 1]