Numpy 多维数组仅注册为一维数组

Numpy multidimensional array only registering as 1D array

我有一组 data from a spread sheet 想拉入 numpy。这些值是 xy 平面中磁铁的磁场点。然后有几个层对应于不同的 z 高度。我的目标是从中构建一个 3 维数组,以便我可以更轻松地对其执行操作。

但是,我似乎无法构建 3D 数组。最终结果仅注册为一维数组,尽管每个元素都是二维矩阵(见下文)。我用更简单的数字重现它所做的任何尝试似乎都没有相同的效果(我能够生成一个 3d 数组)。

如果有任何建议,我将不胜感激。

我的代码如下:

import xlrd
import numpy as np

book = xlrd.open_workbook('./magnetic_mapping.xlsx')
sheet = book.sheet_by_index(0)
n = 0
layer = []
layers = []
layer_name = None

#import pudb; pudb.set_trace()

while True:
    row = sheet.row_values(n) 
    # Look for the start of a new layer, reading a line with nothing 
    # will throw an IndexError, reading a line with a number will throw
    # an AttributionError.
    try:
        if row[0].split()[0] == 'Layer':
            # If we are already reading in data from a layer, save it before
            # starting a new layer
            if layer_name:
                layers.append(np.array(layer))
            layer_name = row[0]
            print layer_name
            layer = []
    except (IndexError, AttributeError):
        # If we are in a layer, and the line is not empty, read in the data
        if layer_name and row[0]:
            data = np.array(row[2:], dtype='S9')
            data[data == ''] = np.nan         # convert empty strings to nan
            layer.append(data.astype(float))

    # Break loop if at EOF, otherwise increment the spreadsheet row.
    if row[0] == 'END':
        break
    else:
        n+=1

# append the last layer recorded
layers.append(np.array(layer))
layers = np.array(layers)

在终端中:

In [1]: layers.shape
Out[1]: (7,)

In [2]: layers[0].shape
Out[2]: (27, 13)

问题是您的 'layers' 形状不一致:

print([ll.shape for ll in layers])
# [(27, 13), (25, 13), (25, 13), (25, 13), (25, 13), (25, 13), (25, 13)]

你的第一个 'layer' 有 27 行,而其余的有 25 行。你想如何处理这种不一致取决于你 - 例如,你可能想要填充所有较小的层NaNs 使它们与最大层的大小相同。目前,一个快速而肮脏的 hack 可能是截断第一层的行:

layers[0] = layers[0][1:-1]
arr = np.dstack(layers)
print(arr.shape)
# (25, 13, 7)

请注意,我正在使用 np.dstack 沿三维连接图层。如果你使用 np.array(layers),你会得到一个 (7,) 类型的数组 np.object,这可能不是你想要的。