我有一个函数foo,它返回一个形状为(1000,2)的数组 如何将其拆分为两个数组a(1000)和b(1000) 我正在寻找这样的事情:
a;b = foo()
我正在寻找一个答案,可以很容易地推广到形状为(1000,5)左右的情况。
答案 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']
访问每个元素。这对我来说有点像疯子科学家,但我认为这很有趣。