如何创建二维数组作为 array.reshape() 方法的重写代码

How to create a 2D array as rewrite code for the array.reshape() method

我正在尝试创建将数组 B 转换为元素数量相等的其他形状数组的函数。

B = np.array([[2, 4, 6], [4, 8, 10]])

array([[2, 4],[6, 4],[8, 10]])

def my_reshape (A, m, n):
    A_ravel = A.ravel()
    A_list = [i for i in A_ravel]
    print(A_list)
    print(len(A_list))

    if m*n == len(A_list):
        for elem in A_list:
            A_shape = [[elem for j in range(n)] for i in range(m)]                    
    else:
        print('Q-ty', m*n, ' - doesn't match to q-ty of list)
        A_shape = []

    return np.array(A_shape)

但它只需要最后一个元素= 10,而不是每个列表?

OUT: 
[2, 4, 6, 4, 8, 10]
array([[10, 10],
       [10, 10],
       [10, 10]])

必须是

    array([[2, 4],
           [6, 4],
           [8, 10]]

2 路

def my_reshape2 (A, m, n):

    for elem in A_list:

        array= []
        for j in range(m):
        temp=[]
            for i in range(n):
                temp.append(i)
        array.append(temp)

    return array

OUT: [[0, 1], [0, 1], [0, 1]]

我必须如何编写代码才能将 A 中的元素放入新数组?

In [99]: B = np.array([[2, 4, 6], [4, 8, 10]])                                                         
In [100]: B                                                                                            
Out[100]: 
array([[ 2,  4,  6],
       [ 4,  8, 10]])

目标:

In [101]: np.array([[2, 4],[6, 4],[8, 10]])                                                            
Out[101]: 
array([[ 2,  4],
       [ 6,  4],
       [ 8, 10]])

简单重塑:

In [102]: B.reshape(3,2)                                                                               
Out[102]: 
array([[ 2,  4],
       [ 6,  4],
       [ 8, 10]])

reshape 说它本质上是拆散数组,然后用新的形状制作一个新的数组:

In [103]: B.ravel()                                                                                    
Out[103]: array([ 2,  4,  6,  4,  8, 10])

您的目标保持 ravelled 元素的顺序相同。无需重新排列。

用列表做同样的事情是更多的工作。

嵌套列表有一个简单的转置操作:

In [104]: B.tolist()                                                                                   
Out[104]: [[2, 4, 6], [4, 8, 10]]
In [105]: list(zip(*B.tolist()))                                                                       
Out[105]: [(2, 4), (4, 8), (6, 10)]
In [106]: B.T                                                                                          
Out[106]: 
array([[ 2,  4],
       [ 4,  8],
       [ 6, 10]])

但你不想要那个。

获得 A_list 的最快方法是

In [107]: B.ravel().tolist()                                                                           
Out[107]: [2, 4, 6, 4, 8, 10]

从中收集 2 个 3 个列表的一种方法是:

In [112]: B_list = B.ravel().tolist()                                                                  
In [113]: [[i,j] for i,j in zip(B_list[::2], B_list[1::2])]                                            
Out[113]: [[2, 4], [6, 4], [8, 10]]

为了模拟reshape的效果,您可以将数据复制到另一个正确形状的数组中:

B = np.array([[2, 4, 6], [4, 8, 10]])
output = np.empty((3, 2), dtype=B.dtype)
output.ravel()[:] = B.ravel()[:]

由于 ravel 几乎总是 returns 简单(连续)数组的视图,结果如预期:

>>> output
array([[ 2,  4],
       [ 6,  4],
       [ 8, 10]])