【问题标题】:How to flatten a numpy ndarray along axis?如何沿轴展平numpy ndarray?
【发布时间】:2012-09-24 08:46:05
【问题描述】:

我有三个数组: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))

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

【问题讨论】:

    标签: python numpy flat multidimensional-array


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      补充一下,如果你想做超出F和C顺序的东西,你可以使用transposed = ndarray.transpose([1,2,0])将第一个轴移动到最后,最后一个到第二个位置,然后执行@987654328 @(我假设 C 顺序,所以将 0 轴移动到末尾)。您也可以使用reshape,它比简单的ravel 更强大(返回形状可以是任意维度)。

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

      【讨论】:

        【解决方案3】:
        >>> 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])
        

        【讨论】:

          【解决方案4】:

          您实际上是在展开一个高维张量。试试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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-22
            • 2015-07-13
            • 2022-10-30
            • 2019-10-29
            • 1970-01-01
            • 2020-09-03
            • 2021-09-11
            相关资源
            最近更新 更多