Python声明列表列表的numpy矩阵

时间:2015-04-18 22:09:26

标签: python-3.x numpy

我想要一个看起来像这样的numpy矩阵 [int,[[int,int]]] 我收到一个看起来像这样的错误" ValueError:用序列设置一个数组元素。"

以下是声明

def __init__(self):
    self.path=np.zeros((1, 2))

我尝试在下面的行中为此分配值

routes_traveled.path[0, 1]=[loc]

loc是一个列表,routes_traveled是对象

2 个答案:

答案 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列表的一个小概括。