Python 大numpy矩阵的排序单元
我已经创建了一个大的(比如说,4000 X 4000)numpy浮动矩阵。我按照浮点值对矩阵的单元格进行排序,生成一个Python 大numpy矩阵的排序单元,python,numpy,Python,Numpy,我已经创建了一个大的(比如说,4000 X 4000)numpy浮动矩阵。我按照浮点值对矩阵的单元格进行排序,生成一个(行、列、值)元组列表。这是我的代码(简化): 我知道逐单元生成效率很低,但我不知道如何使用纯numpy迭代矩阵的(行、列、值)元组也许这才是真正的问题 我目前的方法的问题是,我的计算机在排序过程中完全死机 如果我这样做的话,这不是问题:排序(matrix.flatte())效果很好,实际上相当快,但是我没有得到行和列…是你的朋友。它不会对给定的数组进行实际排序,而是返回一个整数
(行、列、值)
元组列表。这是我的代码(简化):
我知道逐单元生成效率很低,但我不知道如何使用纯numpy迭代矩阵的(行、列、值)
元组也许这才是真正的问题
我目前的方法的问题是,我的计算机在排序过程中完全死机
如果我这样做的话,这不是问题:排序(matrix.flatte())
效果很好,实际上相当快,但是我没有得到行和列…是你的朋友。它不会对给定的数组进行实际排序,而是返回一个整数索引数组,告诉您如何按排序顺序重新排序数组。因此,您可以对行和列值应用相同的排序
下面是一些代码:首先我们生成一个矩阵;在这里,我使用不同数量的行和列,这样我们就可以轻松地检查结果是否正确
>>> import numpy as np
>>> matrix = np.random.randint(100, size=(4000, 5000))
>>> rows, cols = np.indices(matrix.shape)
现在使用argsort
获取索引
>>> reindex = np.argsort(matrix.flatten())
使用这些索引,我们可以恢复排序矩阵:
>>> matrix.flat[reindex]
array([ 0, 0, 0, ..., 99, 99, 99])
以及相应的行和列
>>> rows.flat[reindex]
array([2455, 2870, 1196, ..., 56, 56, 3618])
>>> cols.flat[reindex]
array([ 863, 1091, 4966, ..., 3959, 3887, 4833])
为了验证答案,让我们检查第一行、列对是否确实对应于0
的矩阵条目,以及最后一行、列对是否对应于99
:
>>> r = rows.flat[reindex]
>>> c = cols.flat[reindex]
>>> matrix[r[0], c[0]]
0
>>> matrix[r[-1], c[-1]]
99
编辑:正如nye17的回答所指出的,行和列可以更直接地从reindex
数组中恢复
>>> r, c = divmod(reindex, matrix.shape[1])
这一切运行得相当快(排序步骤需要几秒钟)。我猜您的原始代码锁定机器的原因是您生成的列表占用了大量内存;通过坚持使用numpy数组而不是列表和元组,您的内存开销显著降低。是您的朋友。它不会对给定的数组进行实际排序,而是返回一个整数索引数组,告诉您如何按排序顺序重新排序数组。因此,您可以对行和列值应用相同的排序
下面是一些代码:首先我们生成一个矩阵;在这里,我使用不同数量的行和列,这样我们就可以轻松地检查结果是否正确
>>> import numpy as np
>>> matrix = np.random.randint(100, size=(4000, 5000))
>>> rows, cols = np.indices(matrix.shape)
现在使用argsort
获取索引
>>> reindex = np.argsort(matrix.flatten())
使用这些索引,我们可以恢复排序矩阵:
>>> matrix.flat[reindex]
array([ 0, 0, 0, ..., 99, 99, 99])
以及相应的行和列
>>> rows.flat[reindex]
array([2455, 2870, 1196, ..., 56, 56, 3618])
>>> cols.flat[reindex]
array([ 863, 1091, 4966, ..., 3959, 3887, 4833])
为了验证答案,让我们检查第一行、列对是否确实对应于0
的矩阵条目,以及最后一行、列对是否对应于99
:
>>> r = rows.flat[reindex]
>>> c = cols.flat[reindex]
>>> matrix[r[0], c[0]]
0
>>> matrix[r[-1], c[-1]]
99
编辑:正如nye17的回答所指出的,行和列可以更直接地从reindex
数组中恢复
>>> r, c = divmod(reindex, matrix.shape[1])
这一切运行得相当快(排序步骤需要几秒钟)。我猜您的原始代码锁定机器的原因是您生成的列表占用了大量内存;通过坚持使用numpy数组而不是列表和元组,您的内存开销会显著降低。Mark击败了我,但我只有2美分 以2x2矩阵为例
import numpy as np
# create a random matrix
matrix = np.random.randint(100, size=(2,2))
indice = np.argsort(matrix, axis=None)
# you can also use `divmod` per mark's version
ind_i = indice//2
ind_j = np.mod(indice, 2)
for i, j in zip(ind_i, ind_j) :
print("%4d %4d %10.5f" % (i, j, matrix[i,j]))
它给
1 0 12.00000
0 1 23.00000
1 1 59.00000
0 0 63.00000
马克赢了我一拳,但我只赢了2美分 以2x2矩阵为例
import numpy as np
# create a random matrix
matrix = np.random.randint(100, size=(2,2))
indice = np.argsort(matrix, axis=None)
# you can also use `divmod` per mark's version
ind_i = indice//2
ind_j = np.mod(indice, 2)
for i, j in zip(ind_i, ind_j) :
print("%4d %4d %10.5f" % (i, j, matrix[i,j]))
它给
1 0 12.00000
0 1 23.00000
1 1 59.00000
0 0 63.00000
啊,
axis=None
比我的flatte
调用要好。不错。@MarkDickinson您的mgrid显然比我天真的//+mod调用更好看;-)开个玩笑,你刚刚帮我省了很多时间的等待,所以谢谢:-)@PiminKonstantinKefaloukos哈,那很好,一点也不坏,至少我有点喜欢。啊,axis=None
比我的flatte
电话好。不错。@MarkDickinson您的mgrid显然比我天真的//+mod调用更好看;-)开个玩笑,你刚刚帮我省了很多时间的等待,所以谢谢:-)@PiminKonstantinKefaloukos哈,那很好,一点也不坏,至少我有点喜欢。与其mgrid
,不如rows,cols=np.index(matrix.shape)
更干净一点吧?@DSM确实如此!谢谢。mgrid
,而不是rows,cols=np.indexes(matrix.shape)
会更干净一点吗?@DSM确实会!谢谢