我正在对python中的神经元同步进行一些分析,并且我有一个矩阵,显示同步值作为时间的函数,R(t),用于多次试验。因此,我的矩阵具有以下外观:
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的值?然后,我可以将此代码与我拥有的数据表一起使用,这些数据表太大而无法在堆栈溢出时发布。
答案 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.