将结果存储为大数组的元组

时间:2014-05-14 14:02:22

标签: python numpy scipy scikit-learn

import numpy as np
from scipy import signal

d0 = np.random.random_integers(10, 12, (5,5))
d1 = np.random.random_integers(1, 3, (5,5))
d2 = np.random.random_integers(4, 6, (5,5))
d3 = np.random.random_integers(7, 9, (5,5))
d4 = np.random.random_integers(1, 3, (5,5))
d5 = np.random.random_integers(13, 15, (5,5))

data = np.array([d0,d1,d2,d3,d4,d5])

data = data.reshape(6,25)


data = data.T

想要明智地计算最小值:

minimas =[]
for x in data:
    minima = (signal.argrelmin(x, axis=0))
    minimas.append(x[minima])

希望以原始数据的形式存储结果。

print np.array(minimas).reshape([5,5])

但是

ValueError: total size of new array must be unchanged

是不是可以将结果存储为大型数组的元组? 很高兴知道是否有更有效的方法来解决这个问题。

2 个答案:

答案 0 :(得分:1)

minimas是25个数组的列表(每个形状(2,))。 np.array(minimas)的形状为(25,2)

np.array(minimas).reshape(5,5,2)

作品。

您可以将minimas打包到包含dtype=object

的数组中
minarray = np.empty((5,5),dtype=object) # initialize an empty array of 'objects'
minarray[:] = [tuple(m) for m in minimas]
minarray.reshape(5,5)

array([[(1, 2), (1, 1), (2, 2), (2, 2), (3, 3)],
...
       [(3, 2), (1, 2), (1, 1), (1, 2), (2, 3)]], dtype=object)

如果minimas中的数组大小不同,则数组将自动具有类型object

minimas[-1] = np.array([1,2,3]) # tweak data so there is some length variation
minimas = [tuple(row) for row in minimas]
np.array(minimas)

产生

array([(1, 2), (1, 1), (2, 2), (2, 2), (3, 3), (2, 1), (3, 2), (3, 3),
       (1, 2), (2, 3), (1, 2), (2, 3), (2, 2), (1, 2), (3, 3), (2, 2),
       (1, 3), (3, 1), (3, 2), (2, 1), (3, 2), (1, 2), (1, 1), (1, 2),
       (1, 2, 3)], dtype=object)  # shape=(25,)

可以是reshape(5,5)

如果minimas中的数组长度相同,则np.array(minimas)会生成一个最终尺寸为2的数组。这就是为什么我必须初始化所需类型的minarray数组,并在其中插入minimas的原因。这是我在回答其他SO问题时提到的numpy的一个模糊部分。

答案 1 :(得分:1)

您需要将每个项目转换为列表,然后使用列表切片,您可以索引所需的任何值。

import numpy as np
from scipy import signal

d0 = np.random.random_integers(10, 12, (5, 5))
d1 = np.random.random_integers(1, 3, (5, 5))
d2 = np.random.random_integers(4, 6, (5, 5))
d3 = np.random.random_integers(7, 9, (5, 5))
d4 = np.random.random_integers(1, 3, (5, 5))
d5 = np.random.random_integers(13, 15, (5, 5))

data = np.array([d0, d1, d2, d3, d4, d5])

data = data.reshape(6, 25)

data = data.T

minimas = []
for x in data:
    minima = (signal.argrelmin(x, axis=0))
    minimas.append(x[minima])
tup = list(a.tolist() for a in minimas)
ab = (np.array(tup).reshape(25, 2))
print(ab[0]) #[3 1]