python – 清除numpy数组的元素

有没有一种简单的方法可以清除numpy数组的所有元素?我试过了:

del arrayname

这将完全删除阵列.我在for循环中使用这个数组,迭代数千次,所以我更喜欢保留数组,但每次都用新元素填充它.

我试过numpy.delete,但是根据我的要求,我没有看到使用子阵列规范.

*编辑*:

数组大小不会相同.

我在开头的循环内部分配空间,如下所示.如果这是一个错误的方法,请纠正我:

arrname = arange(x*6).reshape(x,6)

我读取数据集并为数据集中的每个元组构造此数组.我所知道的是列数将是相同的但不是行数.例如,我第一次需要一个大小为(3,6)的数组,下一个元组为(1,6),下一个为(4,6),依此类推.我填充数组的方式如下:

arrname[:,0] = lstname1
arrname[:,1] = lstname2
...

换句话说,列是从元组构造的列表中填充的.因此,在下一个循环开始之前,我想清除它的元素并为连续循环做好准备,因为我不希望前一个循环中的残余混合当前内容.

最佳答案 随着手指的摇摆可能过早优化,我会提出一些想法:

你说你不希望从之前的迭代遗留下来的任何遗留物.从您的代码中可以看出,您为每个已知数量的列逐列填充每个新元素. “遗留”值似乎不是问题.考虑:

>使用arange和reshape没有任何意义.使用np.empty((n,6)).比头发更快或更零.
>您也可以从成分构建新阵列

看到:

lstname1 = np.arange(3)
lstname2 = 22*np.arange(3)
np.vstack((lstname1,lstname2)).T
# returns
array([[ 0,  0],
       [ 1, 22],
       [ 2, 44]])
#or
np.hstack((lstname1[:,np.newaxis],lstname2[:,np.newaxis]))
array([[ 0,  0],
       [ 1, 22],
       [ 2, 44]])

最后,如果你真的真的关心速度,你可以分配最大的预期大小(如果不知道你可以检查请求的大小与最后一个最大,如果它更大,那么使用np.empty((rows,cols))增加大小.

然后在每次迭代时,您创建一个更大矩阵的视图,只需要您想要的行数.这将导致numpy重用相同的缓冲区空间,而不需要在每次迭代时进行任何分配.注意:

In [36]: big = np.vstack((lstname1,lstname2)).T

In [37]: smaller = big[:2]

In [38]: smaller[:,1]=33

In [39]: smaller
Out[39]: 
array([[ 0, 33],
       [ 1, 33]])
In [40]: big
Out[40]: 
array([[ 0, 33],
       [ 1, 33],
       [ 2, 44]])

注意这些建议适合您的扩展问题,并且不适合您之前关于“清除”数组的问题.即使在后一个示例中,您也可以轻松地说small.fill(0)来消除关注点,具体取决于您是否可以在迭代中可靠地重新分配数组的所有元素.

点赞