<p>你好像在问<code>np.nditer</code>。在</p>
<p>除非需要低级控制,否则不希望使用<code>nditer</code>。然而,你几乎永远不需要这种程度的控制。最好不要使用<code>nditer</code>,除非您确切知道为什么需要它。在</p>
<p>你得到的是一个三维纽比阵列。您当前正在迭代数组</em>中的每个元素。相反,您只需要迭代数组的前两个维度(宽度和高度)。在</p>
<hr/>
<h2>迭代三维数组</h2>
<p>作为一个快速的示例,您可以在没有ArcMap的情况下重现所看到的内容:</p>
<pre><code>import numpy as np
data = np.random.random((3, 10, 10))
for value in np.nditer(data):
print value
</code></pre>
<p>(<em>简要说明:我在这里使用<code>arcpy</code>的形状约定<code>nbands x nrows x ncolumns</code>。看到<code>nrows x ncolumns x nbands</code>也是很常见的。在这种情况下,后面部分中的索引表达式将不同于</em>)</p>
<p>同样,<code>nditer</code>不是您想要的,因此如果您确实想这样做(数组中的每个值而不是每个r、g、b像素),那么这样做的可读性会更高:</p>
^{pr2}$
<p>在这种情况下,两者是相同的。在</p>
<hr/>
<h2>迭代像素</h2>
<p>不过,如果继续下去,您需要遍历每个像素。在这种情况下,你可以做一些类似的事情:</p>
<pre><code>import numpy as np
data = np.random.random((3, 10, 10))
for pixel in data.reshape(3, -1).T:
r, g, b = pixel
print r, g, b
</code></pre>
<p>在本例中,我们暂时将10x10x3阵列视为100x3阵列。因为默认情况下numpy数组迭代第一个轴,所以它将迭代每个r,g,b元素。在</p>
<p>如果您愿意,也可以直接使用索引,但速度会慢一些:</p>
<pre><code>import numpy as np
data = np.random.random((3, 10, 10))
for i, j in np.ndindex(data.shape[:-2]):
r, g, b = data[:, i, j]
print r, g, b
</code></pre>
<hr/>
<h2>矢量化,不要遍历<code>numpy</code>数组</h2>
<p>不过,一般来说,像这样逐个元素遍历数组元素并不是使用<code>numpy</code>的有效方法。在</p>
<p>你提到你正在尝试检测何时波段被消除和/或设置为一个常量值。在</p>
<p>有三件事你可能是指:1)只有一个波段,2)某些波段的数据被设置为0(或其他值),3)图像是灰度级的,但存储为RGB。在</p>
<p>您可以通过查看numpy数组来检查频带数:</p>
<pre><code>nbands = data.shape[0]
</code></pre>
<p>或者直接使用<code>arcpy</code>:</p>
<pre><code>nbands = raster.bandCount
</code></pre>
<p>这处理了第一种情况,但是,看起来你在试图检测什么时候乐队没有信息,而不是他们是否在那里。在</p>
<p>如果您总是希望至少有红色、绿色和蓝色(有时是alpha,有时不是),那么最简单的方法是将这些波段展开,这有点类似于:</p>
<pre><code>r, g, b = data[:3, :, :]
</code></pre>
<p>这样的话,如果有α带,我们就忽略它,如果它不存在,那就不重要了。同样,假设数据的形状是nbands x nrows x ncolumns(而不是nrows x ncolumns x nbands)。在</p>
<p>下一步,如果我们想检查一个波段中的所有像素值是否为零,请不要迭代。相反,使用numpy布尔比较。它们的速度将大大提高(100倍):</p>
<pre><code>r, g, b = data[:3, :, :]
print np.all(r == 0) # Are all red values zero?
</code></pre>
<p>但是,我猜你最想检测的是一个存储为RGB的灰度图像。在这种情况下,每个像素的红、绿、蓝值将相等,但像素不会全部相同。您可以通过以下操作进行检查:</p>
<pre><code>gray = (r == b) & (b == g)
print np.all(gray)
</code></pre>
<p>一般来说,您并不想迭代numpy数组中的每个像素。请改用矢量化表达式。在</p>