3

我有三个数组:经度(400,600),纬度(400,600),数据(30,400,60);我要做的是根据数据数组的位置(纬度和经度)提取数据数组中的值。

这是我的代码:

import numpy
import tables

hdf = "data.hdf5"
h5file = tables.openFile(hdf, mode = "r")

lon = numpy.array(h5file.root.Lonitude)
lat = numpy.array(h5file.root.Latitude)
arr = numpy.array(h5file.root.data)

lon = numpy.array(lon.flat)
lat = numpy.array(lat.flat)
arr = numpy.array(arr.flat)

lonlist=[]
latlist=[]
layer=[]
fre=[]

for i in range(0,len(lon)):
    for j in range(0,30):
        longi = lon[j]
        lati = lat[j]
        layers=[j]
        frequency= arr[i]

        lonlist.append(longi)
        latlist.append(lati)
        layer.append(layers)
        fre.append(frequency)

output = numpy.column_stack((lonlist,latlist,layer,fre))

问题是“频率”不是我想要的。我希望数据数组沿零轴展平,这样“频率”将是一个位置的 30 个值。numpy 中是否有这样的函数沿特定轴展平ndarray?

4

4 回答 4

6

你可以试试np.ravel(your_array),或者your_array.shape=-1。该np.ravel函数允许您使用可选参数order:选择C行优先顺序或F列优先顺序。

于 2012-09-24T08:49:32.470 回答
4

我猜你真正想要的只是transpose改变轴顺序。根据您对它的处理方式,在优化内存布局.copy()之后执行 a 可能很有用transposed,因为转置本身不会创建副本。

只是补充一点,如果你想做一些超出FC排序的东西,你可以使用transposed = ndarray.transpose([1,2,0])将第一个轴移动到最后,最后一个移动到第二个位置然后执行transposed.ravel()(我假设 C 顺序,所以将 0 轴移动到最后) . 您也可以使用reshape比简单更强大的ravel(返回形状可以是任何尺寸)。

请注意,除非步幅完全加起来,否则 numpy 将不得不制作数组的副本,transposed.flat()在许多情况下,您可以通过非常好的迭代器来避免这种情况。

于 2012-09-24T09:13:38.103 回答
0
>>> a = np.random.rand(2,2,2)
>>> a
array([[[ 0.67379148,  0.95508303],
        [ 0.80520281,  0.34666202]],

       [[ 0.01862911,  0.33851973],
        [ 0.18464121,  0.64637853]]])
>>> np.ravel(a)
array([ 0.67379148,  0.95508303,  0.80520281,  0.34666202,  0.01862911,
        0.33851973,  0.18464121,  0.64637853])
于 2012-09-24T08:53:58.393 回答
0

你本质上是在展开一个高维张量。试试tensorly.unfold(arr, mode=the_direction_you_want)。例如,

import numpy as np
import tensorly as tl

a = np.zeros((3, 4, 5))

b = tl.unfold(a, mode=1)

b.shape # (4, 15)
于 2021-01-24T23:46:25.090 回答