下午。我目前正在尝试创建一个函数,当给定数组或列表以及指定的列/行/元素选择时,指定的列/行/等将被删除并连接成数组/列表 - 很多以这种方式(但对于任意大小的物体,可能或可能不是很大)
a = [1 2 3 b=['a','b','c'
4 5 6 'd','e','f'
7 8 9] 'g','h','i']
现在,让我们说我想要第1列和第3列。然后这看起来像
a'=[1 3 b'=['a', 'c'
4 6 'd', 'f'
7 9] 'g', 'i]
我熟悉切片索引并使用numpy提取它们 - 所以我想我真正挂断的是创建一些包含列/等的对象(列表或数组/列表数组?) (在上面我选择了第一列和第三列,如你所见),然后迭代该对象以创建我所指定的连接/组合列表(即 - 如果我给出了一个数组有127个变量,我想在给定时间确定任意数量的任意列)
谢谢你看看。如果有任何不清楚的地方,请告诉我如何更新操作。
答案 0 :(得分:1)
你可以使用双列表理解
>>> def select(arr, rows, cols):
... return [[el for j, el in enumerate(row) if j in cols] for i, row in enumerate(arr) if i in rows]
...
>>> select([[1,2,3,4],[5,6,7,8],[9,10,11,12]],(0,2),(1,3))
[[2, 4], [10, 12]]
>>>
请注意,与rows
和cols
中的索引顺序无关,
select
不会对输入的行和列重新排序,请注意这一点
在rows
或cols
中重复使用相同的索引不会为您提供重复的行或列。最后请注意,select
仅适用于列表列表。
那就是说我建议你支持numpy
更加灵活
效率更高。
答案 1 :(得分:1)
这与高级索引有何不同
In [324]: A = np.arange(12).reshape(2,6)
In [325]: A
Out[325]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
In [326]: A[:,[1,2,4]]
Out[326]:
array([[ 1, 2, 4],
[ 7, 8, 10]])
要选择行和列,您必须注意索引广播:
In [327]: A = np.arange(24).reshape(4,6)
In [328]: A[[[1],[3]], [1,2,4]] # column index and row index
Out[328]:
array([[ 7, 8, 10],
[19, 20, 22]])
In [329]: A[np.ix_([1,3], [1,2,4])] # easier with ix_()
Out[329]:
array([[ 7, 8, 10],
[19, 20, 22]])
https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing
可以将索引数组/列表分配给变量 - A
索引的输入可以是元组。
In [330]: idx = [[1,3],[1,2,4]]
In [331]: idx1 = np.ix_(*idx)
In [332]: idx1
Out[332]:
(array([[1],
[3]]), array([[1, 2, 4]]))
In [333]: A[idx1]
Out[333]:
array([[ 7, 8, 10],
[19, 20, 22]])
要将一组切片和索引扩展为单个数组,np.r_
很方便(虽然不是很神奇):
In [335]: np.r_[slice(0,5),7,6, 3:6]
Out[335]: array([0, 1, 2, 3, 4, 7, 6, 3, 4, 5])
还有其他索引工具,indexing_tricks
中的实用程序,np.delete
和np.take
等功能。
尝试np.source(np.delete)
查看如何处理通用删除。