用其他数组生成行列数组的方法

时间:2015-02-17 03:18:57

标签: python arrays numpy

我试图充分利用numpy,但由于我的Noob-ness',我显然在文档中遗漏了一些重要的链接。
我想要做的是创建一个具有一定数量的行和列的数组,并用子数组填充它。当一个遍历行时,子数组增加一对值。对于后续行,使用另一对值来填充列。我提出的最好的方法是使用列表推导来生成所需的输出。在这个阶段,我可以创建一个没有所需形状的阵列......我可以用一种尴尬的方式处理它,所以一切都不会丢失。

这是我到目前为止所做的:

>>> import numpy as np
>>> np.set_printoptions(precision=4,threshold=20,edgeitems=3,linewidth=80)   # default print options
>>> sub = np.array([[1,2],[3,4],[5,6]],dtype='float64')   # a sub array of floats
>>> sub
array([[ 1.,  2.],
       [ 3.,  4.],
       [ 5.,  6.]])
>>> e = np.empty((3,4),dtype='object')   # an empty array of the desired shape
>>> e
array([[None, None, None, None],
       [None, None, None, None],
       [None, None, None, None]], dtype=object)
>>> dX = 1; dY = np.sqrt(3.)/2.0        # values to add to sub array per cell in e
>>> rows,cols = e.shape                 # rows and columns from 'e' shape
>>> out = [sub + [dX*i,dY*(i%2)] for i in range(0,cols)]  # create the first row
>>> for j in range(1,rows):              # create the other rows
...   out += [out[k] + [0,-dY*2*j] for k in range(cols)]    
...   
>>> arr = np.array(out)
>>> arr.shape    # expect to see ((3,4),3,2)...I think
(12, 3, 2)       
>>> arr[0:4]     #  I will let you try this to see the format

最后一行只显示输出数组的前4个元素的格式。我希望做的是以一种比我的列表理解方法更优雅的方式填充空数组e和/或如何正确地重塑数组。同样,除非我在文档中缺少链接,否则我会期望一个包含3x2子阵列的3x4数组...这不是它向我展示的内容。我会感谢任何帮助或链接到适当的文档,因为,我花了几个小时拖着这个网站,我显然错过了一些适当的numpy术语。

1 个答案:

答案 0 :(得分:1)

第一个out是4个(3,2)数组的列表。

此阶段的

np.array(out)会生成(4,3,2)数组。 np.array创建数据允许的最高维数组。在这种情况下,沿着新维度连接这4个数组。

rows循环后,out是12个数组的列表。列表中的out +=...会附加它们。

因此,通过相同的逻辑,arr = np.array(out)将生成(12,3,2)数组。这可以重新塑造:arr = arr.reshape(3,4,3,2)

来自arr的子数组可以复制到e,例如:

e[0,0] = arr[0,0]

这提出了一个问题,为什么你想要像e这样的数组?它比arr有什么优势? arr代表'在发展欠佳的地区,'{n}最好的能力, e`试图扩展到它们。


您的out列表可以使用以下内容进行矢量化:

ii = np.arange(cols)
ixy = np.array([dX*ii, dY*(ii%2)])
arr1 = sub[None,:,:] + ixy.T[:,None,:]

arr1(4,3,2)数组,可以复制到e[0,:]元素。

这可以清理并扩展到其他行。


一种简洁的方法,即迭代e的所有元素,并指定arr的相应子数组使用np.ndindex(来自index_tricks模块):

for i in np.ndindex(3,4):
    e[i]=arr[i]

虽然它是Python级迭代,但它不涉及复制数据。它只是复制指针。我对此感到有些惊讶,但e[i,j]指向与arr[i,j]相同的数据块。从.__array_interface__值和修改条目(例如

)可以看出这一点
e[1,1][0,0] = 30  

更改arr[1,1,0,0]

的值