在optimize方法中将numpy ndarray转换为元组

h7wcgrx3  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(118)

我有numpy ndarray,opencv findContours()的结果。
我想有效地将结果的每个元素从numpy数组转换为元组的元组。
尝试了tolist(),asarray()等,但没有一个给予我确切的结果。

示例

numpy数组:

[[[191 307]]

     [[190 308]]

     [[181 308]]]

tuple of tuples的缩写:

((191,307),(190,308),(181,308))

更新

tuple(elements[0])返回

(array([[191 ,307]], dtype=int32),array([[190, 308]], dtype=int32),array([[181,308]], dtype=int32))
pkmbmrz7

pkmbmrz71#

In [9]: a = numpy.array([[[191, 307]],
   ...:                  [[190, 308]],
   ...:                  [[181, 308]]])

In [10]: tuple(tuple(row[0]) for row in a)
Out[10]: ((191, 307), (190, 308), (181, 308))
vmdwslir

vmdwslir2#

你的数组是3d的:

In [356]: a.shape
Out[356]: (3, 1, 2)

如果你去掉中间的维度,剩下的就很容易被忽略了:

In [357]: tuple(tuple(i) for i in a[:,0,:])
Out[357]: ((191, 307), (190, 308), (181, 308))

如果它不一定是元组,tolist就足够了:

In [358]: a[:,0,:].tolist()
Out[358]: [[191, 307], [190, 308], [181, 308]]
0kjbasz6

0kjbasz63#

我假设这个问题是关于通过解包单元素子数组([1] => 1,或[[1, 2]] => [1, 2])将嵌套numpy.array转换为嵌套tuple s。我在下面应用了一个递归函数来完成这样的转换,它可以推广到任何大小的可迭代容器。所有4个输入都产生相同的预期输出:res = ((191, 307), (190, 308), (181, 308))
collections.abc.Collection确保容器具有以下方法__contains____iter____len__

from collections.abc import Collection
import numpy as np

# npArr = np.array([[[191], [307]], [[190], [308]], [[181], [308]]])
npArr = np.array([[[191, 307]], [[190, 308]], [[181, 308]]])
# npArr = np.array([[[191, 307], [190, 308], [181, 308]]])
# npArr = np.array([[191, 307], [190, 308], [181, 308]])

def func(val):
    if not isinstance(val, Collection):
        return val
    
    if len(val) == 1:
        return func(val[0])

    return tuple(func(elem) for elem in val)

res = func(npArr)
print(f"{npArr = }")
print(f"{res = }")

相关问题