Ошибка: установка элемента массива с последовательностью. 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]