我试图充分利用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术语。
答案 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]
。