Python numpy:对 numpy 二维数组中的每对列执行函数?

2023-11-25

我试图将一个函数应用于 numpy 数组中的每一对列(每列都是一个人的基因型)。

例如:

[48]: g[0:10,0:10]

array([[ 1,  1,  1,  1,  1,  1,  1,  1,  1, -1],
      [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
      [ 1,  1,  1,  1,  1,  1, -1,  1,  1,  1],
      [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
      [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
      [ 1,  1,  1,  1,  1,  1,  1,  1,  1, -1],
      [-1, -1,  0, -1, -1, -1, -1, -1, -1,  0],
      [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
      [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
      [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1]], dtype=int8)

我的目标是生成一个距离矩阵 d ,以便 d 的每个元素都是比较 g 中每一列的成对距离。

d[0,1] = func(g[:,0], g[:,1])

任何想法都会很棒!谢谢你!


您可以简单地将函数定义为:

def count_snp_diffs(x, y): 
    return np.count_nonzero((x != y) & (x >= 0) & (y >= 0),axis=0)

然后使用生成的数组作为索引来调用它itertools.combinations, 为了得到all可能的列组合:

combinations = np.array(list(itertools.combinations(range(g.shape[1]),2)))
dist = count_snp_diffs(g[:,combinations[:,0]], g[:,combinations[:,1]])

另外,如果输出must存储在矩阵中(对于大的g不推荐,因为只有上面的三角形会被填充,其余的都是无用的信息,这可以用同样的技巧来实现:

d = np.zeros((g.shape[1],g.shape[1]))
combinations = np.array(list(itertools.combinations(range(g.shape[1]),2)))
d[combinations[:,0],combinations[:,1]] = count_snp_diffs(g[:,combinations[:,0]], g[:,combinations[:,1]])

Now, d[i,j]返回列之间的距离i and j(然而d[j,i]是零)。这种方法依赖于这样一个事实:数组可以使用包含重复索引的列表或数组进行索引:

a = np.arange(3)+4
a[[0,1,1,1,0,2,1,1]]
# Out
# [4, 5, 5, 5, 4, 6, 5, 5]

这是对正在发生的事情的一步一步的解释。

Calling g[:,combinations[:,0]]访问排列第一列中的所有列,生成一个新数组,将其与生成的数组逐列进行比较g[:,combinations[:,1]]。因此,一个布尔数组diff被生成。如果g有 3 列,看起来像这样,其中每一列都是列的比较0,1, 0,2 and 1,2:

[[ True False False]
 [False  True False]
 [ True  True False]
 [False False False]
 [False  True False]
 [False False False]]

最后,添加每列的值:

np.count_nonzero(diff,axis=0)
# Out
# [2 3 0]

另外,由于python中的boolean类继承自integer类(大致False==0和和True==1,看这个answer of “Python 中的 False == 0 和 True == 1 是实现细节还是由语言保证的?”了解更多信息)。这np.count_nonzero每项加 1True位置,这与获得的结果相同np.sum:

np.sum(diff,axis=0) 
# Out
# [2 3 0]

关于性能和内存的注释

对于大型数组,一次处理整个数组可能需要太多内存,您可以获得Memory Error然而,对于小型或中型阵列,它往往是最快的方法。在某些情况下,按块工作可能很有用:

combinations = np.array(list(itertools.combinations(range(g.shape[1]),2)))
n = len(combinations)
dist = np.empty(n)
# B = np.zeros((g.shape[1],g.shape[1]))
chunk = 200
for i in xrange(chunk,n,chunk):
    dist[i-chunk:i] = count_snp_diffs(g[:,combinations[i-chunk:i,0]], g[:,combinations[i-chunk:i,1]])
    # B[combinations[i-chunk:i,0],combinations[i-chunk:i,1]] = count_snp_diffs(g[:,combinations[i-chunk:i,0]], g[:,combinations[i-chunk:i,1]])
dist[i:] = count_snp_diffs(g[:,combinations[i:,0]], g[:,combinations[i:,1]])
# B[combinations[i:,0],combinations[i:,1]] = count_snp_diffs(g[:,combinations[i:,0]], g[:,combinations[i:,1]])

For g.shape=(300,N),报告的执行时间%%timeit在我的电脑上,python 2.7、numpy 1.14.2 和 allel 1.1.10 是:

  • 10 columns
    • numpy + 矩阵存储:107 µs
    • numpy + 一维存储:101 µs
    • 等位基因:247 µs
  • 100 columns
    • numpy + 矩阵存储:15.7 毫秒
    • numpy + 一维存储:16 毫秒
    • 等位基因:22.6 毫秒
  • 1000 columns
    • numpy + 矩阵存储:1.54 s
    • numpy + 一维存储:1.53 秒
    • 等位基因:2.28 s

使用这些数组维度,纯 numpy 比 allen 模块快一点,但应检查问题中的维度的计算时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python numpy:对 numpy 二维数组中的每对列执行函数? 的相关文章

随机推荐

  • Shift + 鼠标滚轮水平滚动

    对于水平滚动 使用 Shift 滚轮相当常见 这两者都相当容易捕获 我可以使用 MouseWheel 事件以及由 KeyDown KeyUp 事件设置的标志来跟踪何时按下 Shift 键 但是 如何真正触发水平滚动呢 我知道 WM MOUS
  • GHC 7.7 中引入的自由覆盖条件破坏了 GHC 7.6 中有效的代码

    The idea 我正在写一个DSL 编译为 Haskell 该语言的用户可以定义自己的不可变数据结构和关联函数 我所说的关联函数是指属于数据结构的函数 例如 用户可以编写 用 pythonic 伪代码 data Vector a x y
  • 如何使用 gitpython 对当前提交与上次提交进行 git diff?

    我正在尝试掌握 gitpython 模块 hcommit repo head commit tdiff hcommit diff HEAD 1 but tdiff hcommit diff HEAD HEAD 不起作用 也不 HEAD HE
  • 是否可以为 UITableView 添加边框样式? (不是边框颜色/边框宽度)

    是否可以为 UITableView 添加边框样式 不仅仅是边框颜色和边框宽度 例如凹槽边框样式 嘿 您可以使用以下方式为您的视图添加边框CALayer可以在QuartzCore Framework 以下链接将帮助您了解CALayer详细 C
  • 如何使用 Eclipse 将特定于平台的本机库包含在 .JAR 文件中?

    我刚刚开始学习JNI 我一直在遵循一个简单的示例 并且创建了一个调用本机库中的 Hello World 方法的 Java 应用程序 我想以 Win32 和 Linux x86 为目标 我的库驻留在 DLL 中 当 DLL 添加到 Eclip
  • 如何阻止 Eclipse 在每次捕获的异常时崩溃?

    当我开始调试 java 项目时 Eclipse 不断地破坏第 3 方库中的随机异常 这非常烦人 知道如何阻止这个吗 我尝试单击断点视图上的 图标 我可以看到 挂起捕获的异常 和 挂起未捕获的异常 复选框都没有选中 Eclipse 仍然在异常
  • SCSS 与字符串的算术运算

    selector width 10px width width 2 output 10px but expected 5px 上面的代码是不言自明的 请纠正我 您可以使用calc功能 selector width 10px width ca
  • 为什么不能在字节变量中存储负值?

    我正在转换可以在 Java 中运行但不能在 C 中运行的代码 byte buffer new byte 64 this buffer int this count 0x3F 128 这会生成编译时错误 常量值 128 无法转换为 字节 如何
  • 如何在 MySQL 中创建时间点架构

    I read this有关为数据库构建时间点架构的文章 在我看来 这是一个优雅的解决方案 但这篇文章是在不久前 2007 年 就已经准备好的 我想知道 1 还有其他方法可以解决这个问题吗 2 这种方法和其他方法的优缺点是什么 3 是否有可供
  • Burn 中的RegistrySearch 与 util:RegistrySearch

    我在用Burn构建 WiX 引导程序 我意识到如下所示的RegistrySearch实际上并没有搜索注册表 我用了过程监控器监视注册表访问
  • Haskell:类型推断和函数组合

    这个问题的灵感来自于此answer另一个问题 表明您可以使用定义为的函数从列表中删除每个出现的元素 removeall filter 用铅笔和纸根据以下类型进行计算filter and 该函数的类型为 removeall Eq a gt a
  • 将 Ruby 对象序列化为 JSON 并返回?

    我想将一个对象序列化为 JSON 将其写入文件并读回 现在我希望在 net 中有类似的东西 你有 json net 或类似的东西 然后你会这样做 JsonSerializer Serialize obj 并完成它 您将返回 JSON 字符串
  • asp.net mvc 中的动态子域

    我对 ASP NET 相当陌生 对 IIS 也没什么经验 我想让我的应用程序的每个用户都有自己的子域 但都使用相同的控制器 然后子域将控制显示的内容 Example user1subdomain mydomain com Whatever
  • 为什么这样的递归不会出现堆栈溢出?

    我不明白为什么打电话recSetTimeOut 不会导致堆栈溢出错误 而recPromise does const recSetTimeOut gt console log in recSetTimeOut setTimeout recSe
  • 为什么要升级到 c# 4.0?

    我知道 C 4 0 中有一些不错的新功能 但我无论如何也想不出升级现有项目或切换到新项目的令人信服的理由 我看过一些帖子 人们说如果他们的托管服务不提供 Net 4 他们会寻找另一个提供商 因为 Net 4 是他们的方向的核心
  • malloc和free是如何实现的?

    我想实现我自己的动态内存管理系统 以添加有助于管理 C 内存的新功能 我使用 Windows XP 和 Linux Ubuntu 实现 malloc 和 free 等功能需要什么 我认为我必须使用最低级别的系统调用 对于 Windows 我
  • IIS 7.5 Mercurial 设置忽略 maxAllowedContentLength

    我正在尝试在 IIS 7 5 上设置 Mercurial 我有一个应用程序目录的 web config 该目录忽略了maxAllowedContentLength属性和我只是cannot让IIS接受它 我在全球 本地和各个层面尝试了一千种不
  • 使用 Scipy 计算两个矩阵的行点积的向量化方法

    我想尽快计算相同维度的两个矩阵的行点积 这就是我这样做的方式 import numpy as np a np array 1 2 3 3 4 5 b np array 1 2 3 1 2 3 result np array for row1
  • 生成某些数据的防篡改签名?

    我有一个数据 目前 它是一个 XML 文件 但架构可能会发生变化 因此 我们暂时假设它是一个 C 类 当我将数据存储在磁盘或数据库中时 我需要添加某种签名或指纹或校验和或其他任何内容 以确保没有人可以修改数据 警告 即使是有权访问所有源代码
  • Python numpy:对 numpy 二维数组中的每对列执行函数?

    我试图将一个函数应用于 numpy 数组中的每一对列 每列都是一个人的基因型 例如 48 g 0 10 0 10 array 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1