警告:下面的示例可以正常工作,但是使用后期建议的完整参数集会暴露一个错误,或者至少是 numpy.take() 函数中的“未记录的功能”。有关详细信息,请参阅下面的评论。 已提交错误报告。
您可以使用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”参数指定为与输入数组相同,并且您必须设置 mode="clip" 或 mode="wrap"。如果您不设置模式,它将制作一个副本以在 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拉一些丑陋的恶作剧,这让我头疼。