Python 使用嵌套结构按列连接NumPy数组
我有以下3个NumPy阵列:Python 使用嵌套结构按列连接NumPy数组,python,arrays,numpy,Python,Arrays,Numpy,我有以下3个NumPy阵列: arr1 = np.array(['a', 'b', 'c', 'd', 'e', 'f']).reshape(2, 3) arr2 = np.array(['g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p']).reshape(2, 5) arr3 = np.array(['r', 's', 't', 'u']).reshape(2, 2) 我希望以列方式加入它们,但让它们在来自每个数组的项之间保持分隔,如下所示:
arr1 = np.array(['a', 'b', 'c', 'd', 'e', 'f']).reshape(2, 3)
arr2 = np.array(['g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p']).reshape(2, 5)
arr3 = np.array(['r', 's', 't', 'u']).reshape(2, 2)
我希望以列方式加入它们,但让它们在来自每个数组的项之间保持分隔,如下所示:
Output:
array([[['a', 'b', 'c'], ['g', 'h', 'i', 'j', 'k'], ['r', 's']],
[['d', 'e', 'f'], ['l', 'm', 'n', 'o', 'p'], ['t', 'u']]], dtype='<U1')
输出:
数组([['a','b','c'],['g','h','i','j','k'],['r','s'],
[['d','e','f'],['l','m','n','o','p'],['t','u']],dtype='您可以尝试:
print(np.array([[x, y, z] for x, y, z in zip(arr1.tolist(), arr2.tolist(), arr3.tolist())]))
或者,如果希望内部行也作为数组:
print(np.array([np.array([x, y, z]) for x, y, z in zip(arr1.tolist(), arr2.tolist(), arr3.tolist())]))
输出:
[[['a', 'b', 'c'] ['g', 'h', 'i', 'j', 'k'] ['r', 's']]
[['d', 'e', 'f'] ['l', 'm', 'n', 'o', 'p'] ['t', 'u']]]
形状如预期的那样是(2,3)
编辑:
正如您在评论中提到的,请尝试:
l = [arr1, arr2, arr3] # list of the arrays:
print(np.array([np.array([x, y, z]) for x, y, z in zip(*[i.tolist() for i in l])]))
要做到这一点可能需要很长的时间,但它是有效的:
arr_all=[]
对于范围内的i(arr1.shape[0]):
行=[]
行追加([arr[i,:]用于[arr1,arr2,arr3]]中的arr)
arr_all.append(行)
arr_all=np.数组(arr_all).整形(2,3)
我认为这应该会给您提供所需的输出。这是对@U10给出的答案的修改,其中内部元素是python列表
print(np.array([[np.array(x), np.array(y), np.array(z)] for x, y, z in zip(arr1.tolist(), arr2.tolist(), arr3.tolist())]))
如果尝试从这些数组生成对象数据类型数组,则会出现错误:
In [22]: np.array([arr1, arr2, arr3])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-22-155b98609c5b> in <module>
----> 1 np.array([arr1, arr2, arr3])
ValueError: could not broadcast input array from shape (2,3) into shape (2)
但是如果我尝试分配第一列,我会得到相同的错误:
In [17]: arr[:,0] = arr1
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-17-9894797aa09e> in <module>
----> 1 arr[:,0] = arr1
ValueError: could not broadcast input array from shape (2,3) into shape (2)
创建所需数组时遇到的这些困难很好地表明,这不是一个好的numpy
数组结构。如果很难制作,它可能也很难使用,或者至少很慢。在对象数据类型数组上的迭代比在列表上的迭代要慢。与列表相比,它唯一的优点是易于重塑
====
np.array
如果输入是列表而不是数组,则可以工作:
In [33]: np.array([arr1.tolist(), arr2.tolist(), arr3.tolist()])
Out[33]:
array([[list(['a', 'b', 'c']), list(['d', 'e', 'f'])],
[list(['g', 'h', 'i', 'j', 'k']), list(['l', 'm', 'n', 'o', 'p'])],
[list(['r', 's']), list(['t', 'u'])]], dtype=object)
或转换为列表以显示“更干净”:
In [34]: _.tolist()
Out[34]:
[[['a', 'b', 'c'], ['d', 'e', 'f']],
[['g', 'h', 'i', 'j', 'k'], ['l', 'm', 'n', 'o', 'p']],
[['r', 's'], ['t', 'u']]]
该数组的转置确实给出了所需的(3,2)数组:
你能说明你期望的结果形状应该是什么吗?numpy不能有锯齿状数组,即不同长度的数组。或者为了澄清,你可以突出你的外部数组的类型是object
而不是,在我看来,对于给定的示例数组,形状应该是(2,3)。但是,每行这3列中的每一列都将包含自己的数组,其项数等于它们来自的原始数组的列数。您将显示(2,3)对象数据类型数组。为什么不使用列表呢?快速numpy的东西是用于矩形布局中的数值。这是一个很好的答案,但我需要添加一个细微的变化-假设arr的数量没有给定,但它们仍然共享相同的行数(例如,我们有时有arr 1-3,有时有arr 1-6)。我们如何修改您的脚本以考虑压缩的可变元素数?内部元素仍然是python列表。您必须在每个元素(np.array(x))上调用np.array,而不是在[x,y,z]上调用是的!太好了,这正是我想要的。非常感谢!谢谢你的回答,但我真的希望尽可能避免使用循环-这部分代码对我来说需要尽快工作。其他人都在使用循环-列表理解和zip内部元素仍然是python列表。你必须在每个元素上调用np.array(np.数组(x)),不在[x,y,z]上
In [17]: arr[:,0] = arr1
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-17-9894797aa09e> in <module>
----> 1 arr[:,0] = arr1
ValueError: could not broadcast input array from shape (2,3) into shape (2)
In [18]: arr[0,0] = arr1[0]
In [19]: arr[1,0] = arr1[1]
In [20]: arr[0,1] = arr2[0]
...
In [21]: arr
Out[21]:
array([[array(['a', 'b', 'c'], dtype='<U1'),
array(['g', 'h', 'i', 'j', 'k'], dtype='<U1'), None],
[array(['d', 'e', 'f'], dtype='<U1'), None, None]], dtype=object)
In [23]: arr[:,0] = arr1.tolist()
In [24]: arr[:,1] = arr2.tolist()
In [25]: arr[:,2] = arr3.tolist()
In [26]: arr
Out[26]:
array([[list(['a', 'b', 'c']), list(['g', 'h', 'i', 'j', 'k']),
list(['r', 's'])],
[list(['d', 'e', 'f']), list(['l', 'm', 'n', 'o', 'p']),
list(['t', 'u'])]], dtype=object)
In [33]: np.array([arr1.tolist(), arr2.tolist(), arr3.tolist()])
Out[33]:
array([[list(['a', 'b', 'c']), list(['d', 'e', 'f'])],
[list(['g', 'h', 'i', 'j', 'k']), list(['l', 'm', 'n', 'o', 'p'])],
[list(['r', 's']), list(['t', 'u'])]], dtype=object)
In [34]: _.tolist()
Out[34]:
[[['a', 'b', 'c'], ['d', 'e', 'f']],
[['g', 'h', 'i', 'j', 'k'], ['l', 'm', 'n', 'o', 'p']],
[['r', 's'], ['t', 'u']]]
In [35]: _33.T.tolist()
Out[35]:
[[['a', 'b', 'c'], ['g', 'h', 'i', 'j', 'k'], ['r', 's']],
[['d', 'e', 'f'], ['l', 'm', 'n', 'o', 'p'], ['t', 'u']]]