如何沿着轴压缩numpy的ndarray?

4

我有三个数组:longitude(400,600),latitude(400,600),data(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))

问题在于“频率”不是我想要的。我希望数据数组沿轴0展开,这样“频率”就会成为一个位置上的30个值。在numpy中是否有这样的函数可以沿特定轴展平ndarray?
4个回答

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

5
我想你实际上需要的是使用 transpose 来更改轴的顺序。根据你对此的操作,可能需要在 transposed 之后进行 .copy() 以优化内存布局,因为 transpose 本身不会创建副本。
另外,如果你想要创建超出 FC 排序的内容,可以使用 transposed = ndarray.transpose([1,2,0]) 将第一个轴移动到末尾,将最后一个轴移到第二个位置,然后执行 transposed.ravel()(我假设是 C 排序,所以把 0 轴移动到了末尾)。你还可以使用比简单的 ravel 更强大的 reshape(返回形状可以是任何维度)。
请注意,除非步幅完全相加,否则 numpy 将不得不复制数组。在许多情况下,可以通过非常好的 transposed.flat() 迭代器避免这种情况。

0

您实际上是在展开一个高维张量。尝试使用tensorly.unfold(arr, mode=您想要的方向)。例如,

import numpy as np
import tensorly as tl

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

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

b.shape # (4, 15)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接