如何沿轴线展平numpy ndarray?

时间:2012-09-24 08:46:05

标签: python numpy flat multidimensional-array

我有三个数组:经度(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 个答案:

答案 0 :(得分:5)

您可以尝试np.ravel(your_array)your_array.shape=-1np.ravel函数允许您使用可选参数order:为行主要订单选择C或为列主要订单选择F

答案 1 :(得分:4)

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

要添加,如果您想要制作超出FC订单的内容,可以使用transposed = ndarray.transpose([1,2,0])将第一个轴移动到结尾,将最后一个轴移动到第二个轴位置,然后做transposed.ravel()(我假设C顺序,所以将0轴移动到结尾)。您还可以使用比reshape更强大的ravel(返回形状可以是任何维度)。

请注意,除非strides完全相加,否则numpy必须复制数组,在许多情况下,你可以通过非常好的transposed.flat()迭代器来避免这种情况。

答案 2 :(得分: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])

答案 3 :(得分: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)