【问题标题】:How can I create a function that combines list/array rows/columns/elements in arbitrary sized array/list?如何创建一个将列表/数组行/列/元素组合到任意大小的数组/列表中的函数?
【发布时间】:2017-09-14 21:33:00
【问题描述】:

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

a = [1 2 3       b=['a','b','c' 
     4 5 6          'd','e','f'
     7 8 9]         'g','h','i']

现在,假设我想要第一列和第三列。那么这看起来像

  a'=[1 3         b'=['a', 'c'
      4 6             'd',  'f'
      7 9]            'g', 'i]

我熟悉切片索引并使用 numpy 提取它们,所以我想我真正感兴趣的地方是创建一些包含列/任何内容的对象(列表或数组/列表?)(在上面我选择第一列和第三列,如您所见),然后遍历该对象以创建我指定的串联/组合列表(即,如果给定一个包含 127 个变量的数组并且我想精确在给定时间任意数量的任意列)

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

【问题讨论】:

  • 如果你有 list 的 list ,你可以将它转换成一个 numpy 数组并使用 scipy 删除一列或一行
  • 你是说numpy吗?抱歉——我想我在解释我的目标时可能做得很糟糕。我宁愿不必进入程序和硬编码我想要或不想要的列(现在我正在使用一个具有一些笨拙维度的数组).. 理想情况下,我想创建一个函数(谁将元组作为参数除外)。我希望能够在元组中指定任意数量的任意列,并可能将它们存储在一个列表中 - 然后遍历该列表以组合元素(我不确定如何以最好的方式做到这一点)
  • 索引采用列表和元组。这些值不必是“硬编码”的。列表需要对切片以外的任何内容进行迭代,但数组具有“高级索引”。一般来说,选择项目比删除项目更容易。

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


【解决方案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,它更加灵活且 效率更高。

【讨论】:

  • 感谢您的回复!我现在就开始玩这个。你熟悉如何用 numpy 做类似的事情吗?再次感谢!
  • W/r 使用numpy,参见hpauljanswer。他们的答案比我的numpy 的答案要好得多和详细得多,我要删除它(即我之前的答案)。
  • 再次感谢-我仍然可以从您的回答中学到一些东西!
【解决方案2】:

这与高级索引有何不同

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) 看看它如何处理通用删除。

【讨论】:

  • 谢谢!非常感激。我将从练习这个开始。是否可以使用某种内置函数将元素分配给序列中的变量/索引,该函数可以连接行或列,而不管最初调用了多少(不必在代码块的主体中​​为它们声明变量) ?
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多