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 行。你想如何处理这种不一致取决于你 - 例如,你可能想要填充所有较小的层NaN
s 使它们与最大层的大小相同。目前,一个快速而肮脏的 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
,这可能不是你想要的。
我有一组 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 行。你想如何处理这种不一致取决于你 - 例如,你可能想要填充所有较小的层NaN
s 使它们与最大层的大小相同。目前,一个快速而肮脏的 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
,这可能不是你想要的。