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
是不是可以将结果存储为大型数组的元组? 很高兴知道是否有更有效的方法来解决这个问题。
答案 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]