我想要一个看起来像这样的numpy矩阵 [int,[[int,int]]] 我收到一个看起来像这样的错误" ValueError:用序列设置一个数组元素。"
以下是声明
def __init__(self):
self.path=np.zeros((1, 2))
我尝试在下面的行中为此分配值
routes_traveled.path[0, 1]=[loc]
loc是一个列表,routes_traveled是对象
答案 0 :(得分:1)
您是否要创建形状为(1, 2)
的零数组?在这种情况下,请使用np.zeros((1, 2))
。
In [118]: np.zeros((1, 2))
Out[118]: array([[ 0., 0.]])
相反,np.zeros(1, 2)
会引发TypeError
:
In [117]: np.zeros(1, 2)
TypeError: data type not understood
因为the second argument to np.zeros
应该是dtype
,而2不是值dtype
。
或者,要创建一个包含int和一对int的自定义dtype的一维数组,可以使用
In [120]: np.zeros((2,), dtype=[('x', 'i4'), ('y', '2i4')])
Out[120]:
array([(0, [0, 0]), (0, [0, 0])],
dtype=[('x', '<i4'), ('y', '<i4', (2,))])
我不建议这样做。如果这些值都是整数,我认为你最好使用一个简单的ndarray和同类整数dtype,也许是形状(nrows,3):
In [121]: np.zeros((2, 3), dtype='<i4')
Out[121]:
array([[0, 0, 0],
[0, 0, 0]], dtype=int32)
一般来说,我发现使用一个带有简单dtype的数组可以使构建数组到切片和重塑更容易。
答案 1 :(得分:1)
你想要一个更高维的数组,比如3d,或者你真的想要一个二维数组,其元素是Python lists
。真实的列表,而不是numpy数组?
将列表放入数组的一种方法是使用dtype=object
:
In [71]: routes=np.zeros((1,2),dtype=object)
In [72]: routes[0,1]=[1,2,3]
In [73]: routes[0,0]=[4,5]
In [74]: routes
Out[74]: array([[[4, 5], [1, 2, 3]]], dtype=object)
此数组的一个术语是2个元素列表,另一个是3个元素列表。
我本可以直接创建同样的东西:
In [76]: np.array([[[4,5],[1,2,3]]])
Out[76]: array([[[4, 5], [1, 2, 3]]], dtype=object)
但如果我给它2个相同长度的列表,我会得到一个3d数组:
In [77]: routes1=np.array([[[4,5,6],[1,2,3]]])
Out[77]:
array([[[4, 5, 6],
[1, 2, 3]]])
我可以将最后一个routes1[0,1]
编入索引,然后获取一个数组:array([1, 2, 3])
,其中routes[0,1]
给出[1, 2, 3]
。
在这种情况下,您需要清楚地谈论数组,子数组和Python列表。
使用dtype=object
,元素可以是任何内容 - 列表,词典,数字,字符串
In [84]: routes[0,0]=3
In [85]: routes
Out[85]: array([[3, [1, 2, 3]]], dtype=object)
只是要知道这样的数组会丢失很多纯数字数组所具有的功能。数组实际包含的是Python对象的指针 - 只是Python列表的一个小概括。