如何重写用numpy数组附加到列表的代码

2024-10-02 22:37:46 发布

您现在位置:Python中文网/ 问答频道 /正文

Here提到了追加到numpy数组不是一个好主意,因为它需要重新分配数组内存,并且会减慢代码的速度。同时也提到了一些如何避免的提示。我的目标是创建一个saw信号,类似于ASCII艺术:/\/\/\/\。我已经结束了以下两个代码,我不知道哪一个更糟。第二种方法也使用itertools.islice,这也不是它所讨论的世界速度记录器here。这两个代码混合了标准的python列表和numpy数组。有没有一种方法可以实现同样的但使用纯numpy数组?或者更好:有没有什么通用规则可以在任何地方用list.append代替numpy?正如我在第一页上所说的,我提到了一些提示,但我无法找到可行的解决办法。我一直在考虑列表理解之类的东西,它允许我先扩展saw数组,然后再传递给np.hstack,但我不认为这是可能的。我也在考虑首先用numpy.empty(400)np.zeros(400)声明numpy数组,但我不知道如何正确地为它们分配更多的值,而且似乎{}不是那么完全空的,因为它包含零值:

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

1号

^{pr2}$

第二

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

Tags: 方法代码inimportnumpy列表npplt
1条回答
网友
1楼 · 发布于 2024-10-02 22:37:46

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

列表理解只是你的saw。在

np.stack(或np.concatenate)接受一个列表(或列表或数组),因此不需要迭代列表,逐项连接。np.append只是成对串联:

^{pr2}$

使用np.tile复制{}甚至更简单

saw2 = np.tile(x,4)

或者更快一些(tile以类似的方式使用repeat)

saw2 = x[None,:].repeat(4,0).flatten()

相关问题 更多 >