【问题标题】:How to insert rows multiple times to a numpy array?如何向numpy数组多次插入行?
【发布时间】:2018-08-22 15:23:10
【问题描述】:

我有一个数组,我需要检查它的行中是否有缺失值。第二列必须遵循一个序列,如果发现缺失值,我需要插入它。

[[123 1 0
  123 2 0
  123 4 0
  123 5 0
  123 8 0
  123 9 0
  ...]]

在本例中,我需要在第 2 行插入值 [123 3 0],在第 4 行插入值[[123 6 0], [123 7 0]]

我正在逐行迭代数组,检查是否有缺失的行,使用numpy.insert 来执行此操作,但每次插入完成时它都会返回一个副本,从而增加每次插入行的索引此操作完成的时间。

这是一个合理的方法吗?

【问题讨论】:

  • 你能通过查看第一个值和最后一个值来推断缺少多少值吗?然后您可以创建一次完整大小的数组并按顺序填充它。
  • 数组很大会有点难
  • 正如@w-m 建议的那样,只查看第一个和最后一个值并使用range 以正确的大小构建该列。如果其他列中的数据发生变化,您将必须决定如何将这些列填充到您的“内插”位置。你能提供更多的上下文吗?
  • 在列表中插入多个项目时,一个常见的想法是从最大的索引开始并返回。这样你就不必为增长调整索引。但是适应增长并不难。这是一个简单的算术步骤。
  • 如果使用np.insert,最好先收集所有插入、位置和值,然后只调用一次insert。因为它每次调用都会创建一个新数组,所以在循环中重复调用它相对昂贵。

标签: python arrays numpy


【解决方案1】:

不使用insert这样看:

import numpy as np
x = np.array([[123, 1, 0], 
              [123, 2, 0], 
              [123, 4, 0], 
              [123, 5, 0], 
              [123, 8, 0], 
              [123, 9, 0]])
y = np.zeros((x[-1, 1], x.shape[1]))
y[x[:,1] - 1] = x
indexes = np.where((y[:,0] == 0) & (y[:,1] == 0) & (y[:,2] == 0))[0]
y[indexes] = [[123, i + 1, 0] for i in indexes]

现在,

print(y)
[[123., 1., 0.]
 [123., 2., 0.]
 [123., 3., 0.]
 [123., 4., 0.]
 [123., 5., 0.]
 [123., 6., 0.]
 [123., 7., 0.]
 [123., 8., 0.]
 [123., 9., 0.]]

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2018-04-17
    相关资源
    最近更新 更多