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