Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用嵌套结构按列连接NumPy数组_Python_Arrays_Numpy - Fatal编程技术网

Python 使用嵌套结构按列连接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) 我希望以列方式加入它们,但让它们在来自每个数组的项之间保持分隔,如下所示:

我有以下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)
我希望以列方式加入它们,但让它们在来自每个数组的项之间保持分隔,如下所示:

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']]]