如何将numpy数组转换为元组

3

I need to convert array like this:

 [[1527 1369   86   86]
  [ 573  590  709  709]
  [1417 1000   68   68]
  [1361 1194   86   86]]

变成这样:

    [(726, 1219, 1281, 664),
    (1208, 1440, 1283, 1365), 
    (1006, 1483, 1069, 1421),
    (999, 1414, 1062, 1351),]

我试着直接将其转换为元组,但得到了以下结果:

         ( array([1527, 1369,   86,   86], dtype=int32), 
           array([573, 590, 709, 709], dtype=int32),
           array([1417, 1000,   68,   68], dtype=int32), 
           array([1361, 1194,   86,   86], dtype=int32))
           (array([701, 899, 671, 671], dtype=int32),)      

.tolist 方法足够吗? - hpaulj
请参见 https://stackoverflow.com/q/49838872/901925 最新的类似问题。看起来发帖者想要一个结构化数组,而不仅仅是元组列表。 - hpaulj
4个回答

5
tolist数组方法是将数组转换为列表的一种简单快速的方式。它可以正确地处理多个维度:
In [92]: arr = np.arange(12).reshape(3,4)
In [93]: arr
Out[93]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [94]: arr.tolist()
Out[94]: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

对于大多数目的来说,类似于列表的列表与元组的列表或元组的元组一样好,它们之间的区别仅在于可变性。

但是如果您必须使用元组,则列表推导可以很好地进行转换。

In [95]: [tuple(x) for x in arr.tolist()]
Out[95]: [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)]

另一种 [tuple(x) for x in arr] 的方法较慢,因为它是在数组上迭代而不是在列表上迭代。它还会产生不同的结果 - 尽管您必须检查元组元素的类型才能看到这一点。

我强烈建议先使用 tolist 方法,并在之后进行任何从列表到元组的转换。


1
使用元组和映射函数如下所示:

怎么样?

import numpy
numpy_arr = numpy.array(((1527, 1369,   86,   86),(573 , 590 , 709,  709)))
converted_list = tuple(map(tuple,numpy_arr)) # as list
converted_arr = map(tuple,numpy_arr) #as array
print(converted_arr)

1

以下是一个函数,假设你不想让最终对象成为numpy对象。

def fun(var):
  a=[]
  for i in var:
    a.append(tuple(i))
  return a

如果您想要在一行中,

请使用以下代码

def fun(var):
  return [tuple(i) for i in var]

0
如果您更喜欢使用列表推导式而不是map()函数:
a = numpy.random.uniform(0,1,size=(4,4))
a_tuple_list = [tuple(row) for row in a]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接