将numpy数组转换为元组


108

注意:这要求与通常的元组到数组的转换相反。

我必须将一个参数传递给(包装的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数组提供的一些访问。

如果不可能如我所愿地做到这一点,那么通过循环执行此操作的最漂亮的方法是什么?

Answers:



26

这是一个可以完成的功能:

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))

1
很好的概括。但是,作为python新手,我想知道在几乎与非异常状态一样普遍的条件下使用异常是否被认为是一种好的样式。至少在c ++中,通常不赞成通过异常进行流控制。测试是否会更好type(a)==numpy.ndarray
迈克

9
由于“鸭型”和EAFT的概念,这在python中非常常见,请参见docs.python.org/glossary.html#term-duck-typing。这种方法的优点是它将所有嵌套序列转换成嵌套元组,而不仅仅是数组。我应该完成的一件事是,指定要由except块处理的错误。
Bi Rico 2012年

3
在C ++中,由于各种原因,相对于条件而言,例外的速度较慢。在Python中,它们的性能大致相同-这是我们必须在门口检查C ++直觉的地方之一。
dbn

8

我不满意,所以我终于使用了:

>>> 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)

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


3
那不是我想要的元组形状。
迈克,

5

另外的选择

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

如果要将NumPy数组传递给C ++函数,则还可能希望使用Cython或SWIG。


那不会转换为元组。转换为列表?
彼得

你试过了吗?当我运行时,它会生成一个元组。请注意,最后一个调用的函数是tuple,它返回一个元组。如果只有部分没有外部元组,则将获得元组列表。
格雷格·冯·温克尔

有没有更快的方法?
Vicrobot

1
您可以list通过省略方括号来避免创建中间内容,即使用tuple(tuple(row) for row in myarray)
norok2 '19

1

如果您喜欢大刀阔斧,这是另一种方法tuple(tuple(tuple(a_m.tolist())表示a_m中的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))

注意只是(a中a_m的tuple(a_m.tolist())会给出一个生成器表达。受到@ norok2对Greg von Winckel的回答的启发

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.