【问题标题】:Custom arrangement of NumPy array elementsNumPy 数组元素的自定义排列
【发布时间】:2014-08-27 16:35:53
【问题描述】:

我有一个 NumPy 数组“数据”,如下所示:

data = np.array([
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
[0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0]])

我想从给定的数组“数据”中生成数组“结果”。实际上,在所需的数组中,必须将零列放在中间,然后值向右方向增加,而值向左方向减少,如下所示:

result = np.array([
[-180.0, -150.0, -120.0, -90.0, -60.0, -30.0, 0.0, 30.0, 60.0, 90.0, 120.0, 150.0, 180.0],
[-180.0, -150.0, -120.0, -90.0, -60.0, -30.0, 0.0, 30.0, 60.0, 90.0, 120.0, 150.0, 180.0],
[-180.0, -150.0, -120.0, -90.0, -60.0, -30.0, 0.0, 30.0, 60.0, 90.0, 120.0, 150.0, 180.0]])

结果数组应该基于给定数组的索引操作。在 NumPy 中最好的方法是什么?

我尝试了np.rot90, np.flipud, np.fliprl 函数但没有成功。

但是,我想不出如何开始。

【问题讨论】:

    标签: python arrays numpy transformation


    【解决方案1】:

    看看np.roll

    np.roll(data, shift=data.shape[1]//2, axis=1)
    

    这里shift 表示将数据滚动到多少元素(右侧为正值,左侧为负值)。给定规范,我们希望将其沿第二维 (axis=1) 向右滚动数组长度的一半。 // 是整数除法,data.shape[1] 沿第二个维度获取维度的大小(基于零索引)。

    我认为您在 data 中缺少 result 中的 +180.0 值(即您的 result 有 13 列,但您的 data 只有 12 列)。

    In [9]: data = np.array([
    [0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
    [0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0],
    [0.0, 30.0, 60.0, 90.0, 120.0, 150.0, -180.0, -150.0, -120.0, -90.0, -60.0, -30.0]])
    
    In [10]: result = np.roll(data, data.shape[1]//2, axis=1)
    
    In [11]: result
    Out[11]:
    array([[-180., -150., -120.,  -90.,  -60.,  -30.,    0.,   30.,   60.,
              90.,  120.,  150.],
           [-180., -150., -120.,  -90.,  -60.,  -30.,    0.,   30.,   60.,
              90.,  120.,  150.],
           [-180., -150., -120.,  -90.,  -60.,  -30.,    0.,   30.,   60.,
              90.,  120.,  150.]])
    

    这并不是真正基于索引的排序,但考虑到您尝试过的其他方法,我猜这是您可能想要的类型操作。

    【讨论】:

    • 太棒了!公认。顺便说一句,您能否向我解释一下 data.shape[1]//2 和 axis=1
    • 当然,对此添加了一些注释。另请查看 numpy 文档了解更多详细信息。
    • 谢谢,我知道了。
    【解决方案2】:

    所以,我猜您是在尝试将该数组从最小值到最大值排序?从你的问题中并不完全清楚。试试这个?

    result = []
    for row in data:
        result.append(np.sort(row))
    

    您可以使用 numpy 中的工具轻松地将“结果”再次转换为 numpy 数组。还有更多关于np.sort的信息available here

    【讨论】:

    • 不,实际上我正在寻找 @JoshAdel 回答的相同内容
    • 我的错。很高兴您找到了答案。
    猜你喜欢
    • 2014-07-01
    • 2018-07-13
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多