【问题标题】:how to index an element that has been appended to a 1d numpy array python如何索引已附加到 1d numpy 数组 python 的元素
【发布时间】:2019-02-10 21:03:38
【问题描述】:

我有一个问题,我一直在努力解决。我有一个 numpy 数组,我在末尾附加值(如下所示):

array = []
for (x, y, w, h) in e:
    wm = int(x + float(w / 2))
    hm = int(y + float(h / 2)) 
    array.append([numpy.float32(wm),numpy.float32(wh)])
return numpy.array(array)

#and it gives 
[200.90489, 100.39489] #the second last 
[288.0594, 30.0950] #last
#and so on..

我想索引array[0][-2] - array[0][-1],这样我就可以找到第一列中倒数第二个附加元素(200.90489)和第一列中最后一个附加元素(288.0594)之间的区别。 我可以索引列,但我不能索引行,因为它是一维数组,我尝试了多种方法将其转换为二维,但它不起作用。我试过 numpy.resizenumpy.reshape 但都没有帮助。
我该怎么办? 提前致谢!

【问题讨论】:

  • 形状和dtype是什么?
  • 你能修复缩进吗?现在不正确,不清楚你想做什么。
  • 您是否尝试过将其转换为列表?如:list(array[0])[-2] - list(array[0])[-1])?
  • 我认为你交换了 i 和 j。你的意思是array[-1][0]-array[-2][0]?
  • 您的代码示例不好;我们只能猜测您的意图和实际生产的内容。

标签: python arrays numpy


【解决方案1】:

几个cmets:

  • array 是 numpy 的一个关键,你可能不应该将它用作变量名。它会起作用,但这不是最佳做法。

  • return 用于函数末尾的返回值,不能将其放入 for 循环中(另外,即使在函数中,循环也会在第一个 @987654324 处中断@)

  • 看起来您的结果将是一个二维数组,array[i][j] 应该可以工作。但我认为你交换了ij

  • 不知道为什么要转换为 numpy.array,它已经适用于列表。

  • 很多明显不必要的类型转换:float => int => numpy.float32。我会在下面假设你想要一个四舍五入的整数。

所以如果我猜对了你想要做什么,这应该可以工作:

my_array = []
for (x, y, w, h) in e:
    wm = int(x + w/2.)
    hm = int(y + h/2.) 
    my_array.append([wm, wh])

if len(my_array) >= 2:
    last_wm_diff = my_array[-1][0]-my_array[-2][0]
    last_hm_diff = my_array[-1][1]-my_array[-2][1]

# It will work the same if you convert to a numpy array:
my_array = numpy.array(my_array)

if my_array.shape[0] >= 2:
    last_wm_diff = my_array[-1][0]-my_array[-2][0]
    last_hm_diff = my_array[-1][1]-my_array[-2][1]

【讨论】:

  • 我不认为,将其命名为array 是一个大问题;这就是命名空间存在的原因
  • @user8408080 将变量命名为array 不是一个“问题”,但如果使用from numpy import *,它可能会造成混淆并且实际上可能是一个错误。所以这是个坏主意。请注意,from ... import * 也很糟糕,我不建议这样做。
  • 尽管经过进一步的测试,我确实注意到有问题。 last_wm_diff=my_array[-1][0]-my_array[-2][0] 不会产生与我预期相同的结果。通过进一步检查,我注意到 my_array[-1][0],如果数组是 [[285 284]? [330 287]] 给出 330,所以我认为不是 [-1][0] 选择第一列和最后一行(例如 285),而是 [-1] 选择“hm”,所以最后一个元素(在这种情况下hm) 然后 [0] 选择第一列。但我希望 [-1][0] 从 wm 的第一行 [0] 中选择最后一个附加值 [-1],它的形状是 [2,2] 来澄清。
  • 如果A = [[285, 284], [330, 287]],那么A[-1]就是[330 287]A[-1][0]就是330,这没什么错。如果您想要另一个值,请使用另一个索引。 “但我希望 [-1][0] 从第一行 [0] 中选择最后一个附加值 [-1]。”抱歉,它不能按您的意愿工作。你描述的是[0][-1],而不是[-1][0]
  • 您的意思是A=[[24 32]? [43 67]]A=[[24, 32], [43, 67]]
【解决方案2】:

确保您的数组的形状为 (1,2)

那就试试吧:

np.append(array,[numpy.float32(wm),numpy.float32(wh)], axis=0)

【讨论】:

  • 为什么np.insert 比添加列表更好?它不能就地运行。
  • True,然后确保在追加期间指定轴参数。
  • 列表追加不带轴参数!或者你的意思是np.append?我非常不喜欢这个功能。
  • 抱歉没有回复,没有看到你的答案。我确实通过制作一个形状为 (1,2) 的数组来调查您的答案:array=numpy.array([[0]*2 for x in range(1)]) 然后我做了numpy.append(array, [numpy.float32(wm),numpy.float32(hm)], axis=0) 但这会导致错误 ValueError:所有输入数组必须具有相同的维数。 [numpy.float32(wm),numpy.float32(hm)] 的形状为 (2,)。所以我重新塑造了它numpy.reshape(numpy.array([wm,wh]),(-1,2)) so now it has (1,2). Putting it together numpy.append(array,numpy.reshape(numpy.array([w,h]),(-1,2)), axis=0)
  • 但是 numpy.append(array,numpy.reshape(numpy.array([w,h]),(-1,2)), axis=0) 感染 ValueError: cannot reshape array of size 1 成型 (2)。有什么建议么?提前致谢!
猜你喜欢
  • 2021-10-12
  • 2015-08-15
  • 2017-06-18
  • 1970-01-01
  • 2021-08-21
  • 2020-07-07
  • 2015-03-27
  • 2022-01-09
  • 2018-04-11
相关资源
最近更新 更多