清除numpy数组的元素

时间:2012-07-17 00:10:41

标签: python arrays 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
...

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

4 个答案:

答案 0 :(得分:4)

我不清楚你的意思是清楚,数组总会有一些值存储在其中,但你可以将这些值设置为某些值,例如:

>>> A = numpy.array([[1, 2], [3, 4], [5, 6]], dtype=numpy.float)
>>> A
array([[ 1.,  2.],
       [ 3.,  4.],
       [ 5.,  6.]])

>>> A.fill(0)
>>> A
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

>>> A[:] = 1.
>>> A
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

更新

首先,你的问题非常清楚。你写出一个好问题的努力越多,你得到的答案就越好。一个好问题应该让我们清楚你要做什么以及为什么做。此外,示例数据非常有用,只是少量,因此我们可以准确地看到您正在尝试做的事情。

话虽如此。看起来你应该为每次迭代创建一个新数组。创建数组的速度非常快,当大小和内容需要更改时,为什么要重用数组并不清楚。如果您出于性能原因尝试重用它,则可能不会发现任何可测量的差异,调整数组大小并不比创建新数组快得多。您可以通过调用numpy.zeros((X, 6))

来创建新阵列

同样在你的问题中你说:

  

列是从元组

构造的列表中填充的

如果您的数据已作为元组列表存放,则使用numpy.array将其转换为数组。你不需要去创建一个数组并填充它。例如,如果我想从元组列表中获取(2,3)数组,我会这样做:

data = [(0, 0, 1), (0, 0, 2)]
A = numpy.array(data)

# or if the data is stored like this
data = [(0, 0), (0, 0), (1, 2)]
A = numpy.array(data).T

希望有所帮助。

答案 1 :(得分:2)

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

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

  • 使用范围和重塑没有任何意义。使用np.empty((n,6))。比头发更快oneszeros

  • 您也可以从成分构建新阵列

请参阅:

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]])

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

答案 2 :(得分:1)

如果要保持分配的数组,并且具有相同的大小,则无需清除元素。只需跟踪您的位置,并覆盖数组中的值。这是最有效的方法。

答案 3 :(得分:0)

我只是开始将新值放入数组中。

但如果您坚持要清除阵列,请尝试使用zerosempty制作相同尺寸的新阵列。

>>> A = numpy.array([[1, 2], [3, 4], [5, 6]])
>>> A
array([[1, 2],
       [3, 4],
       [5, 6]])

>>> A = numpy.zeros(A.shape)
>>> A
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])