当前位置: 首页 > 知识库问答 >
问题:

使用Numpy按列和排序数组,不包括每列的最大和

皇甫树
2023-03-14

我想通过列和对数组进行排序,删除每列中最大的元素,然后继续排序。

#sorted by sum of columns
def sorting(a):
   b = np.sum(a, axis = 0)
   idx = b.argsort()
   a = np.take(a, idx, axis=1)
   return a

arr = [[1,2,3,8], [3,0,2,1],[5, 4, 25, 67], [11, 1, 6, 10]]
print(sorting(arr))

Here is the output: 

[[ 2  1  3  8]
 [ 0  3  2  1]
 [ 4  5 25 67]
 [ 1 11  6 10]]

我能够找到每个列的最大值及其索引,但如果不删除整行/列,我就无法删除它们。请帮帮我,我是新手!!!

共有1个答案

屈畅
2023-03-14

虽然不是很优雅,但实现这一点的一种方法是使用广播和高级索引:

import numpy as np
arr = np.array([[1,2,3,8], [3,0,2,1],[5, 4, 25, 67], [11, 1, 6, 10]])

首先获取按列总和排序的中间数组。

arr1 = arr[:, arr.sum(axis = 0).argsort()]
print(arr1)
# array([[ 2,  1,  3,  8],
#        [ 0,  3,  2,  1],
#        [ 4,  5, 25, 67],
#        [ 1, 11,  6, 10]])

接下来,获取每列中最大值出现的位置。

idx = arr1.argmax(axis = 0)
print(idx)
# array([2, 3, 2, 2])

现在准备行和列索引数组以从 arr1 切片。请注意,用于计算的行实质上对上面的 idx 中的每个元素执行 {0, 1, 2, 3} 的集合差(通常为 arr 中的行数),并将它们存储在矩阵的列中。

k = np.arange(arr1.shape[0]) # original number of rows
rows = np.nonzero(k != idx[:, None])[1].reshape(-1, arr1.shape[0] - 1).T
cols = np.arange(arr1.shape[1])
print(rows)
# array([[0, 0, 0, 0],
#        [1, 1, 1, 1],
#        [3, 2, 3, 3]])

请注意,col 将被广播为的形状,同时由它们索引 arr1。为了便于理解,col 看起来兼容:

print(np.broadcast_to(cols, rows.shape))

# array([[0, 1, 2, 3],
#        [0, 1, 2, 3],
#        [0, 1, 2, 3]])

基本上,当您(花式)索引arr1时,您会得到第0行、第1行和第3行的第0列;第0、1和2行的第1列等等。希望你明白这个想法。

arr2 = arr1[rows, cols]
print(arr2)
# array([[ 2,  1,  3,  8],
#        [ 0,  3,  2,  1],
#        [ 1,  5,  6, 10]])

为了方便执行乘法运算,可以编写一个简单的函数来组合这些步骤。

 类似资料:
  • 问题内容: 如何按第n列对NumPy中的数组排序? 例如, 我想按第二列对行进行排序,以便返回: 问题答案: 对于“正确”的方式,请参见的关键字参数。 但是,你需要将数组视为具有字段的数组(结构化数组)。 如果你最初没有使用字段定义数组,那么“正确”的方法将非常丑陋。 作为一个简单的示例,对其进行排序并返回副本: 对其进行原位排序: 据我所知,确实是最优雅的方式… 此方法的唯一优点是,参数是用于排

  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }

  • 我想在不使用数组的情况下按降序排列数字。当我使用字符串时,它给出了运行时错误。例如: 这是我写的,但问题是第一个数字没有打印出来,这不是预期的输出。

  • 问题内容: 有没有办法将numpy 2D数组中的列顺序更改为新的任意顺序?例如,我有一个数组 我想将其更改为 通过应用排列 在列上。因此,在新矩阵中,我希望将原始文档的第一列保留在原位置,将第二列移至最后一列,依此类推。 有一个numpy函数可以做到吗?我有一个相当大的矩阵,并且希望得到更大的矩阵,因此我需要一个可以在可能的情况下快速且适当地执行此操作的解决方案(置换矩阵是不可行的) 谢谢。 问题

  • 问题内容: 给定以下数据框 我想按的总和对分组()进行排序,然后按(不对)的值进行分组。所以基本上得到组的顺序 然后通过对/错,最终看起来像这样: 如何才能做到这一点? 问题答案: Groupby A: 在每个组中,对B求和,然后使用transform广播值。然后按B排序: 通过从上方传递索引来索引原始df。这将按B值的总和对A值重新排序: 最后,使用选项保留“ A”组中的“ C”值,以保留步骤1

  • 问题内容: 我有一个关于如何按给定列对整个数组/ recarray排序的简单问题。例如,给定数组: 我想按第一列排序数据以返回: 问题答案: 使用,其中是要排序的列索引: