4

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

删除数组名

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

我尝试了 numpy.delete,但出于我的要求,我没有看到子数组规范的使用。

*已编辑*:

数组大小不会相同。

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

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

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

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

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

4

4 回答 4

5

我不确定你所说的清楚是什么意思,数组中总是会存储一些值,但你可以将这些值设置为某些值,例如:

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

希望有帮助。

于 2012-07-17T00:30:52.813 回答
3

为可能的过早优化摇动手指,我将提供一些想法:

您说您不希望以前的迭代留下任何残余物。从您的代码看来,您为每个已知列数逐列填充每个新元素。“剩余”值看起来不是问题。考虑:

  • 使用 arange 和 reshape 毫无用处。使用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),根据您在迭代中是否可靠地重新分配数组的所有元素来减轻担忧。

于 2012-07-17T21:21:52.663 回答
2

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

于 2012-07-17T02:01:24.067 回答
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.]])
于 2012-07-17T00:20:45.657 回答