Python:从矩阵创建值列表

时间:2017-04-26 23:22:23

标签: python arrays matrix

我正在对python中的神经元同步进行一些分析,并且我有一个矩阵,显示同步值作为时间的函数,R(t),用于多次试验。因此,我的矩阵具有以下外观:

enter image description here

R上的下标表示试验编号,t上的下标表示时间点。我想创建一个数组(称之为L),其中L中的第一个条目是R1达到某个值时的第一个条目,L中的第二个条目是R2达到某个值时的第一次,依此类推。因此,对于一个更具体的例子,我们说我有10个试验和15个时间戳:

import numpy as np

R = np.random.rand(10,15)
print R

我如何从R创建我的数组L(长度为10),以便我可以记录第一次R中的每一行达到大于0.4的值?然后,我可以将此代码与我拥有的数据表一起使用,这些数据表太大而无法在堆栈溢出时发布。

3 个答案:

答案 0 :(得分:1)

以下内容应该有效:

import numpy as np

# for reproducibility
np.random.seed(0)
R = np.random.rand(10, 15)

# your threshold
val = 0.7

现在,您可以使用nonzero查找大于此阈值的条目的索引:

a1, a2 = (R > val).nonzero()

这可以组合成行 - 列对(我删除了一些以节省空间):

pairs = zip(a1, a2)

[(0, 1),
 (0, 7),
 (0, 8),
 (0, 10),
 (0, 13),
 (1, 2),
 (1, 3),
 ...
 (7, 13),
 (8, 0),
 (8, 2),
 (9, 5),
 (9, 8),
 (9, 9),
 (9, 10),
 (9, 12),
 (9, 13),
 (9, 14)]

您始终只想查找第一个匹配项,因此我们检查行索引的跳转位置:

target_indexes = np.where(np.diff(a1) > 0)[0] + 1

当我们错过第一个索引时,我们添加索引0

target_indexes = np.insert(target_indexes, 0, 0)

现在我们可以选择所有索引:

first_occurence = [pairs[ind] for ind in target_indexes]

在这种情况下,我们会收到:

[(0, 1),
 (1, 2),
 (2, 1),
 (3, 7),
 (4, 6),
 (5, 14),
 (6, 3),
 (7, 4),
 (8, 0),
 (9, 5)]

其中元组的第一个值是行,第二个值是列索引。

您可以轻松地提取列索引进行列表理解:

[pi[1] for pi in first_occurence]

给出了

[1, 2, 1, 7, 6, 14, 3, 4, 0, 5]

答案 1 :(得分:0)

R = [ ... ] # Function list
T = [ ... ] #
L = []
threshold = 0.4
for r in R:
    found = None
    for t in T:
        if r(t) > threshold:
            found = t
            break
    L.append(t)
# L should have for each r (in R) the value of t (in T) when r(t) > threshold, or None otherwise

如果您需要“t-index”而不是“t-value”,请查看enumerate并调整代码

答案 2 :(得分:0)

使用numpy:

import numpy as np; np.random.seed(9)
# input array
R = np.random.randint(13,42, size=(4,6))
# timestamps
t = np.arange(0.,R.shape[1])
#threshold array
thresh = np.random.randint(13,42, size=R.shape[0])
# create 2D array for timestamps along columns, threshold along rows
T,Thresh = np.meshgrid(t,thresh)
# set timestamps where R is smaller than thresh to nan
T[R<Thresh] = np.nan
# from remaining timestamps get minimum
v = np.nanmin(T, axis=1)

print R
print thresh
print v

打印

[[41 34 35 37 40 35]
 [14 35 33 40 21 39]
 [30 37 34 40 14 41]
 [13 41 27 40 37 23]]
[37 23 41 37]
[ 0.  1.  5.  1.]

e.g。在第一行中,41已经大于阈值37,因此v中的返回值为0;在第三行中,最后一个值实际上与阈值匹配,因此返回时间戳为5.