【Python】多维narray数组的子数组仍然是narray格式,赋值也无法改变这一点

来源:互联网 发布:xls软件官方下载 编辑:程序博客网 时间:2024/06/18 10:44

问题描述:

当我运行一行代码

a = np.zeros((5,3))

a[1] = [0, 1, 0]

a[1] == [0, 1, 0]   =>true

a[2] ==[0, 0, 0]  => ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

问题解析:

a是一个numpy数组,其子数组也是一个numpy数组

>>> a=np.zeros((5,3))>>> aarray([[ 0.,  0.,  0.],       [ 0.,  0.,  0.],       [ 0.,  0.,  0.],       [ 0.,  0.,  0.],       [ 0.,  0.,  0.]])>>> a[2] == [0,0,1]array([ True,  True, False], dtype=bool)

可以看出,numpy数组和普通数组、numpy数组做逻辑比较,实际上是挨个比较,比较结果仍然是一个numpy数组。

>>> type(a[2])<class 'numpy.ndarray'>

问题解决:

方法一:把a定义为普通二维数组。

方法二:用.all()与.any()

>>> a[2]array([ 0.,  0.,  0.])>>> (a[2]==[0,1,0]).any()True>>> (a[2]==[0,1,0]).all()False

注意:即便是通过如下方式定义的数组,其元素仍然是narray格式。

>>>sss = np.array([[0 for i in range(3)] for j in range(self.N)]>>>sss[0] array([0, 0, 0])

通过赋值方式改变narray元素:

>>> sss[0] = [0,0,0]>>> print(sss)array([[ 0.,  0.,  0.],       [ 1.,  1.,  1.],       [ 1.,  1.,  1.],       [ 1.,  1.,  1.],       [ 1.,  1.,  1.],       [ 1.,  1.,  1.]])>>> type(sss[0])<class 'numpy.ndarray'>