什么是将2d数组拆分为每行数组的最pythonic方法?

时间:2017-11-17 14:49:44

标签: python arrays multidimensional-array

我有一个函数foo,它返回一个形状为(1000,2)的数组 如何将其拆分为两个数组a(1000)和b(1000) 我正在寻找这样的事情:

a;b = foo()

我正在寻找一个答案,可以很容易地推广到形状为(1000,5)左右的情况。

6 个答案:

答案 0 :(得分:6)

zip(*...)成语转换传统的更维度的Python list

x = [[1,2], [3,4], [5,6]]

# get columns    
a, b = zip(*x)   # zip(*foo())
# a, b = map(list, zip(*x))  # if you prefer lists over tuples
a
# (1, 3, 5)

# get rows
a, b, c = x
a
# [1, 2]

答案 1 :(得分:4)

转置和解压缩?

a, b = foo().T
>>> a, b = np.arange(20).reshape(-1, 2).T
>>> a
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
>>> b
array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19])

答案 2 :(得分:2)

您可以使用numpy.hsplit

x = np.arange(12).reshape((3, 4))
np.hsplit(x, x.shape[1])

这将返回一个子数组列表。注意,在2d输入的情况下,子阵列将是形状(n,1)。除非你用它包围一个函数将它们挤压到1d:

def split_1d(arr_2d):
    """Split 2d NumPy array on its columns."""
    split = np.hsplit(arr_2d, arr_2d.shape[1])
    split = [np.squeeze(arr) for arr in split]
    return split

a, b, c, d = split_1d(x)

a
# array([0, 4, 8])

d
# array([ 3,  7, 11])

答案 3 :(得分:1)

你可以使用列表推导,例如

(a,b)=([i[0] for i in mylist],[i[1] for i in mylist])

概括说,你可以在理解中使用理解:

(a,b,c,d,e)=([row[i] for row in mylist] for i in range(5))

答案 4 :(得分:0)

您只需使用int功能即可完成此操作:

zip

现在使用mylist中的维度调用def foo(mylist): return zip(*mylist) ,它将执行必要的操作:

foo

答案 5 :(得分:0)

所以这有点疯了,但是如果你想为你的数组中的每个子数组分配不同的字母,并为任意数量的子数组(最多26个因为字母表)这样做,你可以这样做: / p>

import string
letters = list(string.ascii_lowercase)  # get all of the lower-case letters
arr_dict = {k: v for k, v in zip(letters, foo())}

或更简单(对于最后一行):

arr_dict = dict(zip(letters, foo()))

然后,您可以arr_dict['a']arr_dict['b']访问每个元素。这对我来说有点像疯子科学家,但我认为这很有趣。