Numpy矩阵 - 如何处理任意大小

时间:2016-03-12 16:56:58

标签: python arrays numpy matrix

我有一些代码在输入数据矩阵上执行各种处理功能。输入数据可以是2,3或4D。

我需要从输入数据中删除n-1维矩阵进行处理,然后另一个矩阵接收这个处理过的数据。为了处理不同大小的输入数据,最好的方法是什么。

例如,目前我有以下形式的代码:

import numpy as np

if number_dims == 2:
  output_matrix = np.zeros([size_dim1,final_size_dim2])
  for i in range(0,dim1,1):
      data_to_process = input_data[i,:]
      output_matrix[i,:] = processing_funcs(data_to_process)

if number_dims == 3:
  output_matrix = np.zeros([size_dim1,final_size_dim2,final_size_dim3])
  for i in range(0,dim1,1):
      data_to_process = input_data[i,:,:]
      output_matrix[i,:,:] = processing_funcs(data_to_process)

if number_dims == 4:
  output_matrix = np.zeros([size_dim1,final_size_dim2,final_size_dim3,final_size_dim4])
  for i in range(0,dim1,1):
      data_to_process = input_data[i,:,:,:]
      output_matrix[i,:,:,:] = processing_funcs(data_to_process)

有没有一个很好的方法在没有重复的if语句的python中执行此操作?复杂的是,n-1间接维度中的最终数据大小与输入大小不同,所以我不能这样做:

output_matrix = np.zeros([np.shape(input_data)])

如果有一种方法可以沿尺寸1采取切片,无论有多少其他尺寸,也会很好。

2 个答案:

答案 0 :(得分:1)

for i in range(dim1): 
      output_matrix[i] = processing_funcs(input_data[i])
无论其他方面如何,

都应该有效。对于形状,你可以做一些像output_matrix=zeros(f(input_matrix.shape))

这样的事情

答案 1 :(得分:1)

这些在功能上是相同的:

output_matrix[i,:,:,:]
output_matrix[i,...]
output_matrix[i]

或更一般地说:

x[:,i,j,:,:]
x[:,i,j,...]
x[:,i,j]

只要很清楚尺寸被索引的位置,尾随`:'可省略,或用省略号替换(' ...')。省略号也可以在开头或中间使用 - 只要表达式不明确。

在某些轴上建立索引时,

np.takenp.put也很有用。

您还可以创建索引元组(以及sliceellipsis),然后使用

In [222]: ind=(slice(3,5),slice(None),1,Ellipsis)
In [223]: x[ind].shape
Out[223]: (2, 3, 32)

我认为您的所有案件都可以通过以下方式处理:

result = np.zeros_list(input_data)
for i in range(input_data.shape[0]):
    result[i] = processing_funcs(input_data[i])

result = [processing_funcs(subdata) for subdata in input_data]
result = np.array(result)    

迭代一个数组有效地在第一个轴上进行索引。将结果收集到列表中然后将其传递给np.array是创建数组的标准方法。 np.array通常将列表的元素组合到新维度上的新数组中。您也可以使用concatenate,但这可能需要添加初始维度。

result = [processing_funcs(subdata)[None,...] for subdata in input_data]
result = np.concatenate(result, axis=0)