使用Python根据列表值对矩阵列进行排序

3

我有一个包含任何类型数字的N x 100numpy矩阵,我想要对其进行排序。

为了更加直观,我将使用虚拟值填充它:

import numpy as np

X = np.array( [[float(number) for number in range(100)] for _ in range(10)] )

# X 
[[   0.    1.    2. ...,   97.   98.  99.]
 [   0.    1.    2. ...,   97.   98.  99.]
 [   0.    1.    2. ...,   97.   98.  99.]
 ..., 
 [   0.    1.    2. ...,   97.   98.  99.]
 [   0.    1.    2. ...,   97.   98.  99.]
 [   0.    1.    2. ...,   97.   98.  99.]]

我希望你能翻译所有的N行中的列,使用以下100个元素列表作为关键字进行排序:
# s
["butterfly", "zebra", "cactus", ... "animal", "xylitol", "yoyo"]

这样,输出结果看起来像这样:

# X_sorted
[[   97.    0.    2. ...,   98.   99.  1.]
 [   97.    0.    2. ...,   98.   99.  1.]
 [   97.    0.    2. ...,   98.   99.  1.]
 ..., 
 [   97.    0.    2. ...,   98.   99.  1.]
 [   97.    0.    2. ...,   98.   99.  1.]
 [   97.    0.    2. ...,   98.   99.  1.]]

基本上,我想获取s的字母排序输出,并将其应用于X的列中。
我该如何实现这一点?
我熟悉使用keysort命令,但我不知道在这种情况下如何将其应用于矩阵列。

你在这里确切地使用了numpy吗?这很重要。这里展示的对象都是列表。 - Mad Physicist
X 是一个 numpy 矩阵,s 是一个列表。我对 Python 还很新,所以请告诉我如何更改问题中的显示格式,以避免混淆,如果它们以错误的方式显示。 - user8858897
尝试打印一个numpy数组,并使你的输出匹配。通常情况下,数组开头有np.array(array(来指示它是一个数组(当然,在结尾处有相应的)。 - Mad Physicist
1
我编辑了你的帖子,当它被接受时,你会看到你本可以如何格式化它。 - IMCoins
2个回答

3
如果您的对象是NumPy数组(如X = np.array(X); s = np.array(s)),那么您可以使用np.argsort,它返回一个索引数组,该数组可以使输入排序。
X_sorted = X[:, np.argsort(s)]

1
相信只要s类似于数组,np.argsort就会强制转换。 - Paul Panzer

-1
基本上,你的工作是按降序对字符串列表进行排序,获取排序后数组在原始数组中的索引,并将其应用于原始numpy数组的每一行。以下是实现此功能的代码。
# This gives indices of array s in descending alphabetical order
s_sorted_indices_desc = np.argsort(np.array(s))[::-1]

# This applies sorting according to the indices obtained above, to each row
X_sorted = np.apply_along_axis(lambda row: row[s_sorted_indices_desc], 1, X)

在问题中您看到了降序排列在哪里? - Mad Physicist
1
第二个操作应该只是一个单独的索引操作。apply 函数完全不必要。 - Mad Physicist
@MadPhysicist 隐含的假设是蝴蝶的索引为97,而斑马的索引为0。 - Sagar B Hathwar
1
动物的索引为97。蝴蝶的索引为0。 - Mad Physicist
1
尝试使用OP的输入运行。你会明白我的意思。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接