【问题标题】:Split elements in numpy array拆分numpy数组中的元素
【发布时间】:2016-11-21 12:16:41
【问题描述】:

我有一个大数组,其中的一部分如下面的小示例所示。 在每个列表中,第一个数字是开始,第二个数字是结束 (所以有一个范围)但每个元素都是序列的一部分,并且 每个序列从零开始。 .我想做的是:

小例子:

array([[ 469, 1300],
       [ 171, 1440],
       [ 187, 1564],
       [ 204, 1740],
       [  40, 1363],
       [  56, 1457],
       [ 132,  606],
       [1175, 2096],
       [ 484, 2839],
       [ 132, 4572],
       [ 166, 1693],
       [  69, 3300],
       [ 142, 1003],
       [2118, 2118],
       [ 715, 1687],
       [ 301, 1006],
       [  48, 2142],
       [  63,  330],
       [ 479, 2411]], dtype=uint32)

我想从索引为 0 的每个序列的开头开始 (不包括在范围内)直到 -20 之前 每个范围的开始。

我试过这段代码:

cds = np.column_stack([cdspos[:, 0] - cdspos[:, 0], cdspos[:, 0] - 20])

但它给出了这个错误:

    y = _nx.arange(0, num, dtype=dt)
 MemoryError

但我试试这个:

cds = np.column_stack([cdspos[:, 0] - 100, cdspos[:, 0] - 20])

完美运行。问题是我没有相同的范围 在起点之前(都不是100)。

所以,我想得到一个像这样的更小的范围(列表):(0)到 (开始 20)。例如第一个元素是这样的:

[ 0, 449]

我也试过了

cds = np.column_stack([0, cdspos[:, 0] - 20])

但没用。

对于这个小例子,我正在寻找的输出是这样的:

array([[0, 449],
       [0, 151],
       [0, 167],
       [0, 184],
       [0, 20],
       [0, 36],
       [0,  112],
       [0, 1155],
       [0, 464],
       [0, 112],
       [0, 146],
       [0, 49],
       [0, 122],
       [0, 2098],
       [0, 695],
       [0, 281],
       [0, 28],
       [0,  43],
       [0, 459]], dtype=uint32)

你们知道怎么做吗?

【问题讨论】:

  • 我试过了,效果很好: cds1 = np.column_stack([np.zeros(len(cdspos), dtype="uint32") , cdspos[:, 1]])

标签: python arrays numpy


【解决方案1】:

怎么样

In [17]: numpy.array([[0, start -20] for start, end in a], dtype=numpy.uint32)
Out[17]: 
array([[   0,  449],
   [   0,  151],
   [   0,  167],
   [   0,  184],
   [   0,   20],
   [   0,   36],
   [   0,  112],
   [   0, 1155],
   [   0,  464],
   [   0,  112],
   [   0,  146],
   [   0,   49],
   [   0,  122],
   [   0, 2098],
   [   0,  695],
   [   0,  281],
   [   0,   28],
   [   0,   43],
   [   0,  459]], dtype=uint32)

【讨论】:

  • @log0:同样的错误:y = _nx.arange(0, num, dtype=dt) MemoryError >>>
  • 你的原始数组有多大?
  • 大约是20000
  • 我看起来您的内存不足。 20000 行相当小(大约 160kb),程序的另一部分肯定是内存泄漏。你检查内存消耗了吗?
【解决方案2】:

这是一种方法:

In [22]: np.column_stack((np.zeros(a.shape[0], dtype=np.int8), (a[:,0]- 20).astype(np.int16)))
Out[22]: 
array([[   0,  449],
       [   0,  151],
       [   0,  167],
       [   0,  184],
       [   0,   20],
       [   0,   36],
       [   0,  112],
       [   0, 1155],
       [   0,  464],
       [   0,  112],
       [   0,  146],
       [   0,   49],
       [   0,  122],
       [   0, 2098],
       [   0,  695],
       [   0,  281],
       [   0,   28],
       [   0,   43],
       [   0,  459]], dtype=int16)

请注意,在这种情况下,我使用np.int8 表示零,np.int16(如果您的数字更大以适合int16,则使用np.uint32)作为第二列数字。如果您再次遇到内存错误,这意味着您无法立即将数组保存在 RAM 中。您可以将数组划分为多个部分,并分别对不同部分应用操作并分别处理它们。如果这是不可能的

【讨论】:

  • 我又得到了这个错误:y = _nx.arange(0, num, dtype=dt) MemoryError
  • @user3631908 在这种情况下,您可以手动指定类型,我认为这会有所帮助。尝试更新。
  • 现在错误是:ValueError: Number of samples, -1, must be non-negative.
  • @user3631908 我认为您的数字更适合int16,因此请改用int32
猜你喜欢
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多