Here提到附加到 numpy 数组不是一个好主意,因为它需要重新分配数组内存并且会减慢代码速度。还提到了一些如何避免它的提示。我的目标是创建一个锯齿信号,类似于 ASCII 艺术:/\/\/\/\
。我最终得到了以下两个代码,但我不知道哪一个更糟糕。第二个还使用了 itertools.islice
,它也不是它所讨论的世界速度记录器 here 。两个代码都混合了标准 python 列表和 numpy 数组。有没有办法如何实现相同但使用纯 numpy 数组?或者更好:是否有任何通用规则可以在任何地方使用 numpy 来使用 list.append
代替?正如我在第一页所说的,提到了一些提示,但我无法找出可行的解决方案。我一直在考虑像列表理解这样的东西,它允许我首先扩展 saw
数组,然后我可以将其传递给 np.hstack
但我认为这是不可能的。我也一直在考虑首先使用 numpy.empty(400) 或 np.zeros(400) 声明 numpy 数组,但我不知道如何正确分配给它们更多值,似乎 np.empty
并不是那么完全空,因为它包含零值:
In [106]: x = np.zeros(10)
In [107]: x
Out[107]: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [108]: y = np.empty(10)
In [109]: y
Out[109]: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
第一
import numpy as np
import matplotlib.pyplot as plt
saw = []
for x in xrange(0, 3):
saw.append(np.hstack((np.linspace(0,1,50), np.linspace(1,0,50))))
saw2 = saw[0]
for x in saw:
saw2 = np.append([saw2], [x])
plt.figure()
plt.plot(np.arange(saw2.size), saw2)
plt.show()
第二
import numpy as np
from itertools import islice
import matplotlib.pyplot as plt
saw = []
for x in xrange(0, 4):
saw.append(np.hstack((np.linspace(0,1,50), np.linspace(1,0,50))))
saw2 = saw[0]
for x in islice(saw, 1, None, 1):
saw2 = np.append([saw2], [x])
plt.figure()
plt.plot(np.arange(saw2.size), saw2)
plt.show()
最佳答案
您的 2 次迭代的大小仅为 3。即构造一个 (400,)
数组。这种迭代不需要太担心。
我可以通过编写以下内容来清理您的代码:
xup=np.linspace(0,1,50)
xdn=np.linspace(1,0,50)
x=np.hstack([xup,xdn])
saw2 = np.hstack([x for _ in range(4)])
列表理解只是您的锯
。
np.stack
(或np.concatenate
)采用一个列表(或多个列表或数组),因此无需迭代列表,执行连接项按项目。 np.append
只是一个成对连接:
np.append(saw2,x) == np.concatenate([saw2,x])
使用np.tile
复制x
就更简单了
saw2 = np.tile(x,4)
或者更快一点的东西(tile
以类似的方式使用重复)
saw2 = x[None,:].repeat(4,0).flatten()
关于python - 如何重写使用 numpy 数组附加到列表的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31724279/