是否有一种简单的方法来清除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
...
换句话说,列是从元组构造的列表中填充的。因此,在下一个循环开始之前,我想清除它的元素并为连续循环做好准备,因为我不希望前一个循环中的残余混合当前内容。
答案 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))
。比头发更快ones
或zeros
。
您也可以从成分构建新阵列
请参阅:
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)