【问题标题】:Python column addition of numpy arrays with shift带有移位的numpy数组的Python列添加
【发布时间】:2014-03-27 02:23:21
【问题描述】:

如何使用 python numpy 数组通过 shift 完成列添加?

我有一个二维数组,需要它的扩展副本。

a = array([[0, 2, 4, 6, 8],
       [1, 3, 5, 7, 9]])

我想要类似的东西(以下是伪代码,它不起作用;据我所知,numpy 中没有a.columns):

shift = 3
mult_factor = 0.7
for column in a.columns - shift :
    out[column] = a[column] + 0.7 * a[column + shift] 

我也知道,我可以使用索引来做类似于我需要的事情。但我似乎真的过分枚举三个值并只使用一个(j):

for (i,j),value in np.ndenumerate(a):
    print i,j

我创立了,我可以遍历列,但不能遍历它们的索引:

for column in a.T:
    print column

虽然我可以简单地使用类似于 xrange 的东西来做到这一点,但适用于多维数组:

In [225]: for column in np.ndindex(a.shape[1]):
            print column
   .....:     
(0,)
(1,)
(2,)
(3,)
(4,)

所以现在我只知道如何使用简单的 xrange 来做到这一点,我不确定这是最好的解决方案。

out = np.zeros(a.shape)
shift = 2
mult_factor = 0.7
for i in xrange(a.shape[1]-shift):
    print a[:, i]
    out[:, i] =  a[:, i] + mult_factor * a[:, i+shift]

然而,在 Python 中它可能不会那么快。 你能给我一个建议吗?它的性能如何?也许有更快的方法来完成 numpy 数组的列添加与 shift ?

【问题讨论】:

  • 这是什么版本的numpy? (a.columns 对我不起作用)。另外,你能解释一下班次的输出应该是什么吗?
  • a.columns 将不起作用它是伪代码,代表我真正需要的。 shift 是用于添加列的偏移量,仅此而已,第一个输出列应该是第一个输入列plus first+shift 列

标签: python arrays numpy iteration


【解决方案1】:
out = a[:, :-shift] + mult_factor * a[:, shift:]

我认为这就是您要寻找的。它是循环的矢量化形式,在 a 的大片上运行,而不是逐列运行。

【讨论】:

  • 所以一般来说,在 numpy 向量中,算术向量应该是等长的。我尝试了类似的东西,但没有这样优雅。请您解释一下numpy 是如何执行此添加的?
  • @PavelShvechikov:这个问题有很多不同的可能答案,具体取决于您实际需要回答的方面。您可以查看broadcasting tutorial,它很有可能回答有关 NumPy 如何处理数组上的算术运算的问题。
【解决方案2】:

我并不肯定我完全理解计算的数量应该是什么,但这里有两件事似乎与您的要求密切相关:

  1. 如果您有一个名为a 的二维数组,您希望将其转换为一维数组列表,即a 的列,您可以这样做

    cols = [c for c in a.T]

  2. 如果我没记错的话,看起来你想要的可以用矩阵乘法来完成。您可以使用numpy.diag 在 numpy 中创建一个带状矩阵,或者,由于每个带 1、mult_factor 或 0 的值相同,您可以使用 scipy.linalg.toeplitz

    m,n = a.shape
    乐队 = np.eye(1,n)
    带 [0,shift] = 多因子
    T = scipy.linalg.toeplitz(np.eye(1,m),band)
    out = np.inner(a,T)

对于大型矩阵,如果您只想添加两列或几列a,则对T 使用稀疏矩阵可能是有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2021-06-18
    • 1970-01-01
    • 2019-05-15
    • 2021-07-16
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多