Python 2D数组和ND数组在numpy中的索引方式不同

Python 2D数组和ND数组在numpy中的索引方式不同,python,arrays,numpy,Python,Arrays,Numpy,作为一个更大项目的一部分,我需要能够在标量场的每个N维上进行正交投影。实际上,我想取除投影维之外的所有维中数据的平均值。下面是相关代码的一个简化但完整且可运行的摘录。。。。投影尺寸为第0或第1轴时除外。在这种情况下,代码的行为就好像这两个维度已经交换一样。我需要帮助理解为什么会发生这种情况,以及协调这种行为的最佳方法是什么,以便无论哪个维度被索引,程序都能始终如一地工作 from pylab import * import scipy.interpolate def projectAxis(d

作为一个更大项目的一部分,我需要能够在标量场的每个N维上进行正交投影。实际上,我想取除投影维之外的所有维中数据的平均值。下面是相关代码的一个简化但完整且可运行的摘录。。。。投影尺寸为第0或第1轴时除外。在这种情况下,代码的行为就好像这两个维度已经交换一样。我需要帮助理解为什么会发生这种情况,以及协调这种行为的最佳方法是什么,以便无论哪个维度被索引,程序都能始终如一地工作

from pylab import *
import scipy.interpolate

def projectAxis(d,projection_dim,nDim) :
    """calculate (and plot) the mean across all axes, except for the
    projection dimension

    """
    all_axes_except_projection_dim = range(nDim)
    all_axes_except_projection_dim.remove(projection_dim)
    plot(mean(d,axis=tuple(all_axes_except_projection_dim)))
    ylim(0,1); yticks([0,1]);

def test(nDim,varies_in_dim,col=1) :
    """Generate a gradient in nDim-dimensional space, and project it in
    each dimension. """

    ## generate 1000 randomly distributed coordinates
    xs = np.random.rand(1000,nDim) 
    ## generate a value to be associated with each coordinate.  The
    ## value is assigned such that it correlates (exactly) with a
    ## particular dimension / axis of the data. The particular
    ## dimension is assigned by the parameter 'varies_in_dim'.
    z = xs[:,varies_in_dim] 

    ## interpolate, to create a regular n-dimensional mesh
    lattice_width = 11 
    m_points = [linspace(0,1,lattice_width)]*nDim
    interpolation_points = tuple(np.meshgrid(*m_points))
    zi = scipy.interpolate.griddata(xs, z, interpolation_points, method='nearest')

    def plotProjection(axis,nDim) :
        projectAxis(zi,axis,nDim)
        if col == 3 :
            ylabel('axis=%d' %(axis))
            gca().yaxis.set_label_position("right")

    # if there are sufficient dimensions to display
    # variation in the specified dimension...
    if nDim > varies_in_dim :
        for d in xrange(4) :
            if nDim > d :
                subplot2grid((rows,cols),(d,col))
                plotProjection(d,nDim)
                if d == 0 :
                    title('%d-D space' %(nDim))


figure(figsize=(7,8))
rows,cols = 4,4
varies_in_dim = 1
suptitle('Data should only substantially vary along axis %d' %(varies_in_dim) )

test(2,varies_in_dim,col=0)
test(3,varies_in_dim,col=1)
test(4,varies_in_dim,col=2)
test(5,varies_in_dim,col=3)

show()
当使用varies_in_dim=2或更高的值运行时,输出是我所期望的。对于每个3、4或5维的测试用例空间,显示变化的唯一投影是第2维,其中维度从0索引。以下是_dim=2中的变量_的输出,这是正确的:

但当varies_in_dim=1时,输出显示维度0的变化……反之亦然:当varies_in_dim=0时,输出显示维度1的变化。下图显示了_dim=1中variages_的输出,该输出错误地显示了发生在维度0中的变化


我错过了什么?我的程序应该如何重新组织以一致地工作?

我想知道:我是否使用了scipy.interpolate.griddata错误?不确定这是否是原因;dr,但是:默认情况下交换前两个维度,以取悦Matlab用户。meshgrid…,index=ij不交换前两个维度。这就解决了它。非常感谢。我对matlab的厌恶加剧了!这种不一致的行为怎么可能是默认行为?令人震惊的那么contourf和imshow在幕后进行类似的轴交换吗?你能给我指一下这方面的文件吗?谢谢。也许你可以发表你的评论作为答案。。。