【问题标题】:Python3 Numpy np.where ErrorPython3 Numpy np.where 错误
【发布时间】:2018-08-04 01:20:37
【问题描述】:

我有 2 个这样的列表

x = [None,[1, 15, 175, 20],
    [150, 175, 18, 20],
    [150, 175, 18],
    [192, 150, 177],...]


y = [None,[12, 43, 55, 231],
    [243, 334, 44, 12],
    [656, 145, 138],
    [12, 150, 177],
    [150, 177, 188],...]

现在我想擦除低于 30 的 x 值和与擦除的 x 值相对应的 y 值。 (例如,x[1] 和 y[1] 中的 (x,y) = (1,12))

为了做到这一点,我尝试在 Numpy 中使用 np.where。

我使用 np.array 将 x 和 y 列表转换为数组并为 x 得到了这个

array([None, list([11]), list([12, 11]), ..., list([12, 13]),list([13, 13]), list([13, 15])], dtype=object)

然后我用 np.where(a

TypeError: '>' not supported between instances of 'NoneType' and 'int'

我认为第一个列表中的 None 值是问题,所以我实现了

np.where(a[1:]>30)

然后我得到了 TypeError:“list”和“int”的实例之间不支持“>”

我是初学者,想知道是什么导致了这个错误。

【问题讨论】:

  • 是否要保留嵌套列表结构?
  • Numpy 不能很好地处理像这样的锯齿状数组,或者将列表和整数混合作为数组元素。
  • x.dtype 是对象。没有一个不能与 30 相比,列表也不能。忘记在这里使用数组。使用x 的列表版本。

标签: arrays python-3.x list numpy


【解决方案1】:

使用列表推导:

In [161]: x = [None,[1, 15, 175, 20],
     ...:     [150, 175, 18, 20],
     ...:     [150, 175, 18],
     ...:     [192, 150, 177]]
     ...:     

我们要从x(和y?)中删除的项目的索引。我使用x[1:] 跳过需要额外测试的None

In [163]: [(i,j) for i,v1 in enumerate(x[1:]) for j,v2 in enumerate(v1) if v2<30]
Out[163]: [(0, 0), (0, 1), (0, 3), (1, 2), (1, 3), (2, 2)]

x 中的值是&gt;=30

In [164]: [[v2 for v2 in v1 if v2>=30] for v1 in x[1:]]
Out[164]: [[175], [150, 175], [150, 175], [192, 150, 177]]

我们可以使用Out[163] 值从y 中删除项目。或者,我们可以一起遍历xyzip(x,y) 等)。

如果列表推导变得过于混乱,可以将它们重写为循环,也可能是函数。

对于像这样的不规则嵌套列表结构,我认为使用numpy 没有任何意义。 Object dtype 数组基本上是列表(但没有有用的列表方法)。

【讨论】:

  • 非常感谢。你节省了我很多时间。我会研究 zip 并尝试去做!
猜你喜欢
  • 2019-05-16
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2020-07-29
相关资源
最近更新 更多