Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大numpy矩阵的排序单元_Python_Numpy - Fatal编程技术网

Python 大numpy矩阵的排序单元

Python 大numpy矩阵的排序单元,python,numpy,Python,Numpy,我已经创建了一个大的(比如说,4000 X 4000)numpy浮动矩阵。我按照浮点值对矩阵的单元格进行排序,生成一个(行、列、值)元组列表。这是我的代码(简化): 我知道逐单元生成效率很低,但我不知道如何使用纯numpy迭代矩阵的(行、列、值)元组也许这才是真正的问题 我目前的方法的问题是,我的计算机在排序过程中完全死机 如果我这样做的话,这不是问题:排序(matrix.flatte())效果很好,实际上相当快,但是我没有得到行和列…是你的朋友。它不会对给定的数组进行实际排序,而是返回一个整数

我已经创建了一个大的(比如说,4000 X 4000)numpy浮动矩阵。我按照浮点值对矩阵的单元格进行排序,生成一个
(行、列、值)
元组列表。这是我的代码(简化):

我知道逐单元生成效率很低,但我不知道如何使用纯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确实会!谢谢