将numpy数组转换为元组

k4emjkb1  于 2023-10-19  发布在  其他
关注(0)|答案(6)|浏览(117)

**注意:**这是要求进行通常的元组到数组转换的逆操作。

我必须将一个参数作为嵌套元组传递给( Package 的c++)函数。例如,以下工作

X = MyFunction( ((2,2),(2,-2)) )

而下列各项 * 不 *

X = MyFunction( numpy.array(((2,2),(2,-2))) )
X = MyFunction( [[2,2],[2,-2]] )

不幸的是,我想使用的参数是一个numpy数组。对于某个N,该数组的维数始终为2xN,这可能相当大。
有没有简单的方法把它转换成元组?我知道我可以循环,创建一个新的元组,但更希望numpy数组提供一些不错的访问。
如果不可能像我希望的那样很好地做到这一点,那么最好的方法是什么呢?

8ftvxx2r

8ftvxx2r1#

>>> arr = numpy.array(((2,2),(2,-2)))
>>> tuple(map(tuple, arr))
((2, 2), (2, -2))
r6hnlfcb

r6hnlfcb2#

这里有一个函数可以做到这一点:

def totuple(a):
    try:
        return tuple(totuple(i) for i in a)
    except TypeError:
        return a

举个例子:

>>> array = numpy.array(((2,2),(2,-2)))
>>> totuple(array)
((2, 2), (2, -2))
relj7zay

relj7zay3#

我不满意,所以我最后用了这个:

>>> a=numpy.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])

>>> tuple(a.reshape(1, -1)[0])
(1, 2, 3, 4, 5, 6)

我不知道是不是更快,但看起来更有效;)

368yc8dk

368yc8dk4#

另一种选择

tuple([tuple(row) for row in myarray])

如果你要将NumPy数组传递给C++函数,你可能还想看看使用Cython或SWIG。

8nuwlpux

8nuwlpux5#

如果你喜欢长切,这里有另一种方法tuple(tuple(a_m.tolist())for a_m in a)

from numpy import array
a = array([[1, 2],
           [3, 4]])
tuple(tuple(a_m.tolist()) for a_m in a )

输出为((1,2),(3,4))
注意,(tuple(a_m.tolist())for a_m in a)将给予一个生成器表达式。灵感来自@norok2对Greg von Winckel's answer的评论

agxfikkp

agxfikkp6#

这里是一个递归的解决方案tuple-ify一个任意嵌套的可迭代序列,

from collections.abc import Iterable
import numpy as np

npArr = np.array(((2,2),(2,-2)))

def func(val):
    if not isinstance(val, Iterable):
        return val
    return tuple(func(elem) for elem in val)

# # One-liner
# func = lambda val: tuple(func(elem) for elem in val) if isinstance(val, Iterable) else val

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

相关问题