【问题标题】:Apply same permutation for every row in a 2D numpy array对 2D numpy 数组中的每一行应用相同的排列
【发布时间】:2023-03-29 05:40:01
【问题描述】:

要置换一维数组A 我知道你可以运行以下代码:

import numpy as np
A = np.random.permutation(A)

我有一个二维数组,想对数组的每一行应用完全相同的排列。有什么方法可以指定 numpy 为您执行此操作吗?

【问题讨论】:

  • 很抱歉没有说得很清楚。每行应该具有与应用排列之前相同的元素集,但是在每行中排列元素的方式应该相同。因此,如果位置 0 的元素移动到位置 4,那么每一行都应该发生同样的情况。
  • 换句话说,你想置换A的列?

标签: python arrays algorithm numpy


【解决方案1】:

为 A 中的列数生成随机排列,并索引到 A 的列中,就像这样 -

A[:,np.random.permutation(A.shape[1])]

示例运行 -

In [100]: A
Out[100]: 
array([[3, 5, 7, 4, 7],
       [2, 5, 2, 0, 3],
       [1, 4, 3, 8, 8]])

In [101]: A[:,np.random.permutation(A.shape[1])]
Out[101]: 
array([[7, 5, 7, 4, 3],
       [3, 5, 2, 0, 2],
       [8, 4, 3, 8, 1]])

【讨论】:

  • 您的方法似乎正在更改行的值,例如在排列之前的第一行中我们没有 2,但之后我们有 2。我想要一些例如,如果第一行的一个元素在置换后位于位置 0 到位置 4,那么对于第二行的位置 0 和所有其他行的元素也应该发生同样的情况.
【解决方案2】:

其实你不需要这样做,来自documentation

如果 x 是一个多维数组,它只会沿着它的第一个 索引。

所以,取 Divakar 的数组:

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

你可以这样做:np.random.permutation(a) 并得到类似的东西:

array([[2, 5, 2, 0, 3],
       [3, 5, 7, 4, 7],
       [1, 4, 3, 8, 8]])

P.S. 如果您需要执行列排列 - 只需执行 np.random.permutation(a.T).T。类似的事情也适用于多维数组。

【讨论】:

    【解决方案3】:

    这取决于你对每一行的意思。

    如果您想置换所有值(不管行和列),请将您的数组重新整形为 1d,置换,重新整形回 2d。

    如果您想对每一行进行排列,但不打乱不同列之间的元素,您需要通过一个轴循环并调用排列。

    for i in range(len(A)):
        A[i] = np.random.permutation(A[i])
    

    它可能会以某种方式缩短,但这就是它可以做到的方式。

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2021-05-18
      • 2021-01-21
      • 2018-08-28
      • 2013-12-14
      相关资源
      最近更新 更多