如何创建一个组合任意大小的数组/列表中的列/数组行/列/元素的函数?

时间:2017-04-18 21:22:54

标签: arrays list python-3.x numpy iteration

下午。我目前正在尝试创建一个函数,当给定数组或列表以及指定的列/行/元素选择时,指定的列/行/等将被删除并连接成数组/列表 - 很多以这种方式(但对于任意大小的物体,可能或可能不是很大)

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个变量,我想在给定时间确定任意数量的任意列)

谢谢你看看。如果有任何不清楚的地方,请告诉我如何更新操作。

2 个答案:

答案 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]]
>>> 

请注意,与rowscols中的索引顺序无关, select不会对输入的行和列重新排序,请注意这一点 在rowscols中重复使用相同的索引不会为您提供重复的行或列。最后请注意,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.deletenp.take等功能。

尝试np.source(np.delete)查看如何处理通用删除。