- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
。 m 和 n 都可以相当大。众所周知,从 0 到 m 的每个整数有时只出现一次,但大多数情况下在 a 中的某-6ren">
我有一个形状为 (n, 3)
的 numpy 数组 a
,其中填充了从 0
到 m
的整数>。 m
和 n
都可以相当大。众所周知,从 0
到 m
的每个整数有时只出现一次,但大多数情况下在 a
中的某处恰好出现两次。连续没有重复的索引。
我现在想构造“反向”索引,即两个形状为 (m, 2)
的数组 b_row
和 b_col
每一行都包含 a
中的(一个或两个)行/列索引,其中 row_idx
出现在 a
中。
这有效:
import numpy
a = numpy.array([
[0, 1, 2],
[0, 1, 3],
[2, 3, 4],
[4, 5, 6],
# ...
])
print(a)
b_row = -numpy.ones((7, 2), dtype=int)
b_col = -numpy.ones((7, 2), dtype=int)
count = numpy.zeros(7, dtype=int)
for k, row in enumerate(a):
i = count[row]
b_row[row, i] = k
b_col[row, i] = [0, 1, 2]
count[row] += 1
print(b_row)
print(b_col)
[[0 1 2]
[0 1 3]
[2 3 4]
[4 5 6]]
[[ 0 1]
[ 0 1]
[ 0 2]
[ 1 2]
[ 2 3]
[ 3 -1]
[ 3 -1]]
[[ 0 0]
[ 1 1]
[ 2 0]
[ 2 1]
[ 2 0]
[ 1 -1]
[ 2 -1]]
但是由于a
上的显式循环而很慢。
有关如何加快速度的任何提示?
最佳答案
这是一个解决方案:
import numpy as np
m = 7
a = np.array([
[0, 1, 2],
[0, 1, 3],
[2, 3, 4],
[4, 5, 6],
# ...
])
print('a:')
print(a)
a_flat = a.flatten() # Or a.ravel() if can modify original array
v1, idx1 = np.unique(a_flat, return_index=True)
a_flat[idx1] = -1
v2, idx2 = np.unique(a_flat, return_index=True)
v2, idx2 = v2[1:], idx2[1:]
rows1, cols1 = np.unravel_index(idx1, a.shape)
rows2, cols2 = np.unravel_index(idx2, a.shape)
b_row = -np.ones((m, 2), dtype=int)
b_col = -np.ones((m, 2), dtype=int)
b_row[v1, 0] = rows1
b_col[v1, 0] = cols1
b_row[v2, 1] = rows2
b_col[v2, 1] = cols2
print('b_row:')
print(b_row)
print('b_col:')
print(b_col)
输出:
a:
[[0 1 2]
[0 1 3]
[2 3 4]
[4 5 6]]
b_row:
[[ 0 1]
[ 0 1]
[ 0 2]
[ 1 2]
[ 2 3]
[ 3 -1]
[ 3 -1]]
b_col:
[[ 0 0]
[ 1 1]
[ 2 0]
[ 2 1]
[ 2 0]
[ 1 -1]
[ 2 -1]]
编辑:
IPython 中用于比较的小基准。如@eozd所示由于 np.unique
在 O(n) 中运行,算法复杂度原则上更高,但对于实际大小来说,矢量化解决方案似乎仍然要快得多:
import numpy as np
def method_orig(a, m):
b_row = -np.ones((m, 2), dtype=int)
b_col = -np.ones((m, 2), dtype=int)
count = np.zeros(m, dtype=int)
for k, row in enumerate(a):
i = count[row]
b_row[row, i] = k
b_col[row, i] = [0, 1, 2]
count[row] += 1
return b_row, b_col
def method_jdehesa(a, m):
a_flat = a.flatten() # Or a.ravel() if can modify original array
v1, idx1 = np.unique(a_flat, return_index=True)
a_flat[idx1] = -1
v2, idx2 = np.unique(a_flat, return_index=True)
v2, idx2 = v2[1:], idx2[1:]
rows1, cols1 = np.unravel_index(idx1, a.shape)
rows2, cols2 = np.unravel_index(idx2, a.shape)
b_row = -np.ones((m, 2), dtype=int)
b_col = -np.ones((m, 2), dtype=int)
b_row[v1, 0] = rows1
b_col[v1, 0] = cols1
b_row[v2, 1] = rows2
b_col[v2, 1] = cols2
return b_row, b_col
n = 100000
c = 3
m = 200000
# Generate random input
# This does not respect "no doubled indices in row" but is good enough for testing
np.random.seed(100)
a = np.random.permutation(np.concatenate([np.arange(m), np.arange(m)]))[:(n * c)].reshape((n, c))
%timeit method_orig(a, m)
# 3.22 s ± 1.3 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit method_jdehesa(a, m)
# 108 ms ± 764 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
关于python - 加速索引 "revert",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50389518/
链接: http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-howto-rollback.html 描述了错误提交后回滚 SVN 目录的两种
我在 bitbucket 上有一个远程 git 存储库(它是私有(private)的,所以恐怕我不能在这里共享链接)...我在那里有几个分支,其中两个是: 大师 证书创建 昨天我在分支 *cert_c
我对 GIT 有一个很奇怪的情况,第一次看到这个。所以基本上在版本控制中它显示我有一个更改的文件。此文件是一个 svg: file_test.svg 当我恢复它时,它只是用 替换了这个文件File_T
我刚刚在服务器中从 511 恢复到 510;然而,即使服务器显然使用 510,511 仍然在某个地方并且 Tortoise SVN 正在考虑 511 作为头版本,因此认为没有什么可以提交的。我能做什么
我有一个形状为 (n, 3) 的 numpy 数组 a,其中填充了从 0 到 m 的整数>。 m 和 n 都可以相当大。众所周知,从 0 到 m 的每个整数有时只出现一次,但大多数情况下在 a 中的某
在线阅读,我知道 git revert 取消了过去的单个提交,但我不清楚这意味着什么,除非取消的提交是最后一次执行的提交。 例如,观察一个文件的以下三个版本: "a" => "aa" => "a|a"
假设我的提交已经推送到 Github A > B > C > D > E -- 头部 我想恢复到 B ,所以我使用 git reset --hard 现在,它看起来像 A > B -- 头部 因此,
所以很久以前,我在我的项目中添加了一个文件夹 abc,其中包含一组文件,并提交了修订版 xyz。在多次提交后,有人用 git rm -r abc 删除了文件夹。在此之后也有很多提交。 现在我需要取回文
我在使用 git revert 命令时遇到问题。我使用 Ubuntu 12.04 Linux 和 Git 版本 1.7.9.5。 我在本地 PC 上创建了一个全新的 b_test_repo,并从远程
在 Subversion (SVN) 中,可以执行 svn revert ./*,其中当前目录和仅当前目录被还原。 什么是 Git 等同于 svn revert 的,其中只有当前目录被还原? 我知道有
我目前正在制作一个脚本,在其中我已经熟悉 Tortoise SVN 及其相应的命令行功能。 我正确更新了脚本,以通过一系列测试找到正确构建的“修订版”。在脚本记录该变量(特定于版本号的)之后,我更新到
简单地说:我的右键菜单似乎缺少恢复到以前版本的选项。 我使用的是 1.7.5 版。根据帮助文件,当我进行人民币修订时,我应该看到: 与工作副本比较 将更改显示为统一差异 与以前的修订版比较 与以前的修
如何进行全局设置,使 revert 命令忽略备份创建? 最佳答案 您可以在 .hgrc 中创建别名 [alias] revert = revert --no-backup # or better ma
如果我想放弃所有更改并返回到存储库中的代码,我会执行以下操作: $ rm -fr * $ svn up 这很简单,但我想知道是否有一个命令可以完成此任务,例如: $ svn revert-all 最佳
这个问题在这里已经有了答案: Is there a way to recover from an accidental "svn revert"? (10 个答案) 关闭 4 年前。 我不小心执行了
我的案例应该是一个简单的案例,但它让我感到困惑,而且我在这里的任何其他答案中都没有发现任何实际有效的东西。 我有几个要回滚到 master 的 merge 。我想要的最终结果是将 master 设置回
有没有办法在不更改工作目录中的文件的情况下恢复旧的提交?我不久前提交了一次,但我提交的代码还没有准备好,我希望这些更改作为未提交的更改保留在我的工作目录中,以便我现在可以继续处理它们。我查看了 rev
我想删除 git 存储库上的特定提交,以便能够删除应用到我的软件的“修复”。 这是一个 EMC: #!/bin/bash rm -rf TEST .git mkdir TEST git init ec
当我通过 TortoiseGit 执行 git revert 时,我得到这个可爱的窗口: 但是,当我想从命令行执行相同操作时,the documentation设法完全混淆了我。如何还原所有本地未提交
通常 git revert 命令会自动创建一些带有提交日志消息的提交,说明哪些提交已被还原。 要避免自动提交,可以选择 -n(或 --no-commit)。 但是在这个命令之后,还原的文件在暂存区。我
我是一名优秀的程序员,十分优秀!