将tupel数组转换为2d数组

时间:2017-12-15 17:22:50

标签: python arrays list numpy multidimensional-array

方法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的输出应该保持这样。

3 个答案:

答案 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索引更改为要查看的最后一个元素的索引,再加上一个。