【问题标题】:Numpy: appending items to matrix-like arrayNumpy:将项目附加到类似矩阵的数组
【发布时间】:2016-03-23 09:28:20
【问题描述】:

我以前用 R 编写代码,现在试图找到进入 python 的方法。我大部分时间都在使用列表,但现在我需要用 numpy 完成任务。不知何故,与 R 相比,这似乎完全不同,而且大多数时候我遇到了广播不同形状的输入数组的问题。也许如果我能弄清楚下面的代码出了什么问题,我就能更好地理解 numpy 试图做什么以及如何处理数组的某些部分。

import numpy as np

a = np.array((1,2,3,4))
b = np.array((2,4,6,8))
c = np.array((3,6,9,12))

myArray = np.asarray((a,b,c))

现在我想在 myArray 上附加每一行的平均值。我试过这个:

for i in range(myArray.shape[0]):
    myArray[i] = np.append(myArray[i,:], np.mean(myArray[i,:]))

我得到“无法将输入数组从形状 (5) 广播到形状 (4)。我想,它试图将新项目压缩到大小为 4 的旧数组中,而我想 追加 它。我该怎么做?

我想要的输出如下所示:

[In] print myArray
[Out] [[1.0  2.0  3.0  4.0  2.5]
      [2.0, 4.0, 6.0, 8.0, 5.0]
      [3.0, 6.0, 9.0, 12.0, 7.5]]

【问题讨论】:

    标签: arrays python-2.7 numpy


    【解决方案1】:

    使用.mean(1) 获取跨行的平均值/平均值,然后使用np.column_stack 将它们作为两个“柱状块”堆叠在输入数组旁边,就像这样 -

    np.column_stack((myArray,myArray.mean(1)))
    

    为了循环执行,需要初始化并存储,如下图-

    m,n = myArray.shape               # Get shape of input array
    # Define output array with same rows as input, but one more column in it
    myArrayOut = np.zeros((m,n+1))    
    for i in range(myArray.shape[0]):
        # Store each row alongwith its mean as the last element
        myArrayOut[i] = np.append(myArray[i,:], np.mean(myArray[i,:]))
    

    【讨论】:

    • 我更新了问题并添加了所需的输出。 column_stack 看起来很棒,但你也可以在循环中应用它吗?我可能必须向这些数组添加不同的值更新:好的,我计算了一个包含所有所需值的列表“d”,而不是列堆叠的 myArray 和 d。那行得通,但是我必须为要附加的每个项目创建一个新列表。也许有更简单的方法来做到这一点?
    • @offeltoffel 那么,您是在寻找数组列表还是单个数组作为输出?
    • 单数组输出是最方便的。 “初始化和存储”的想法很棒,因为我总是知道最终数组的大小,所以我可以提前创建它,然后用堆叠或附加的值填充它。谢谢!
    • @offeltoffel 这将取决于实际用例,但对于性能(这就是人们选择 NumPy 的原因),我会使用矢量化方法。请注意这一点。
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2018-06-13
    • 2016-02-29
    • 1970-01-01
    • 2015-10-06
    • 2017-03-04
    • 2015-09-12
    相关资源
    最近更新 更多