警告:以下示例正常运行,但是使用在后期建议的完整参数集会暴露numpy.take()函数中的bug或至少一个“未记录的功能”。有关详细信息,请参见下面的评论。 错误报告已提交。
您可以使用numpy的take()函数就地执行此操作,但是它需要一些箍跳。
这是对一个单位矩阵的行进行随机排列的示例:
import numpy as np
i = np.identity(10)
rr = range(10)
np.random.shuffle(rr)
np.take(i, rr, axis=0)
array([[ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
要做到这一点原地的,所有你需要做的是指定的“out”参数是一样的输入数组和您必须设置模式=“夹”或模式=“包装”。如果不设置模式,它将在Python异常下进行复制以恢复阵列状态(请参见此处)。
最后一点,take似乎是一个数组方法,所以代替
np.take(i, rr, axis=0)
你可以打电话
i.take(rr, axis=0)
如果这更符合您的口味。因此,总的来说,您的呼叫应类似于以下内容:
#Inplace Rearrange
arr = makeMyBixMatrix()
pVec0, pVec1 = calcMyPermutationVectors()
arr.take(pVec0, axis=0, out=arr, mode="clip")
arr.take(pVec1, axis=1, out=arr, mode="clip")
要置换行和列,我认为您要么必须运行两次,要么使用numpy.unravel_index拉一些丑陋的恶作剧,这让我难以思考。