方法detect_keypoints(imagename, threshold)
的输出会返回ndarray
,如下所示:
[[131 326 1 0]
[135 281 1 0]
[159 405 1 0]]
基本上还有更多的数据,但我会对这个问题保持简单。仅仅通过这个数组,我无法得到某些列,我的实际目标是什么。它保持tellung我,上面的ndarray
元组,因此我无法访问它的任何值。所以,我试图将ndarray
转换为2D数组以读取每个数组的所有整数。
到目前为止我的实施:
经过研究,我实施了这个转换:
def keypoints2D(imagename, threshold):
keypoints = detect_keypoints(imagename, threshold)
keypoints = np.array(keypoints)
lst = [list(i) for i in keypoints]
print(lst)
keypoints_lst = lst[:, 0]
print(keypoints_lst)
return lst
这样做,我会得到
[[array([131, 326, 1, 0]), array([135, 281, 1, 0]), array([159, 405, 1, 0])]]
尽管如此,我希望通过转换这样的内容来实现:
[[131, 326, 1, 0]
[135, 281, 1, 0]
[159, 405, 1, 0]]
如果我尝试获取某个专栏,它会一直告诉我keypoints_lst = lst[:, 0]
中有例外:
TypeError: list indices must be integers or slices, not tuple
就异常而言,返回值仍然是一个元组。如何将其更改/转换为正确的2D阵列?然而ndarray
的输出应该保持这样。
答案 0 :(得分:1)
[[131 326 1 0]
[135 281 1 0]
[159 405 1 0]]
看起来像一个二维数组,可以简单地用第一列的arr[:,0]
索引,arr[0,:]
第一行。 arr[0,1]
实际上是arr[(0,1)]
。数组采用索引元组。
数组显示逗号,列表为。
您的转化看起来像是带有数组元素的嵌套列表。列表不接受多维索引(元组)。
alist[0] # first element
alist[0][1] # element of the first sublist
keypoints = np.array(keypoints)
lst = [list(i) for i in keypoints]
我不知道原始keypoints
(来自detect_keypoints
)。但是lst
行正在创建列表列表。
如果我从嵌套列表开始:
In [183]: target=[[131, 326, 1, 0],
...: [135, 281, 1, 0],
...: [159, 405, 1, 0]]
...:
In [184]: target
Out[184]: [[131, 326, 1, 0], [135, 281, 1, 0], [159, 405, 1, 0]]
我可以制作一个二维数组,显示为您的第一个项目:
In [185]: arr = np.array(target)
In [186]: arr
Out[186]:
array([[131, 326, 1, 0],
[135, 281, 1, 0],
[159, 405, 1, 0]])
In [187]: print(arr)
[[131 326 1 0]
[135 281 1 0]
[159 405 1 0]]
可以通过列
轻松编制索引简单地通过列表理解传递:
In [190]: [list(i) for i in arr]
Out[190]: [[131, 326, 1, 0], [135, 281, 1, 0], [159, 405, 1, 0]]
tolist
做同样的事情:
In [191]: arr.tolist()
Out[191]: [[131, 326, 1, 0], [135, 281, 1, 0], [159, 405, 1, 0]]
你得到一个数组列表的嵌套列表这一事实表明在源中有另一层嵌套。
答案 1 :(得分:1)
从它的外观来看,输出
[[array([131, 326, 1, 0]), array([135, 281, 1, 0]), array([159, 405, 1, 0])]]
看起来像是1D-numpy数组列表的列表。
所以一个工作但不好的方法是将lst转换为numpy数组,或者首先不要将它转换为列表。 如果你计划将lst转换为numpy,那么就这样了。
lst = np.array(lst)
print(lst[:,:,0])#shall get you the first column
答案 2 :(得分:0)
只需取出keypoints_lst = lst[:, 0]
中的逗号即可。当你包含逗号时,Python认为你给了一个元组,你不能这样做。现在,这将消除错误,但keypoints_lst = lst[:0]
将返回一个空列表,我认为你不想要。 Python列表切片遵循mylist[start:stop:step]
的格式。如果未提供start
,则默认为0
。因此,stop
也是0
,您将获得一个空列表。将stop
索引更改为要查看的最后一个元素的索引,再加上一个。