首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“撤销”numpy.delete,numpy.insert?

“撤销”numpy.delete,numpy.insert?
EN

Stack Overflow用户
提问于 2019-10-28 21:49:07
回答 3查看 147关注 0票数 1

我有numpy数组,我想删除少量条目。在此之后,我想插入以前的索引它们所属的位置。numpy.insert并没有做到这一点:

代码语言:javascript
复制
import numpy

a = numpy.random.rand(7)
idx = [5, 0]

# delete some indices
b = numpy.delete(a, idx)

# magic
b /= 1.0

# insert back?
c = numpy.insert(b, idx, a[idx])

# nope :(
assert numpy.all(numpy.abs(a - c) < 1.0e-10)

有什么暗示吗?(更喜欢简单的答案。)

也许有一个更好的解决方案比使用删除在第一,例如,通过切片左右。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-28 22:08:47

有一种方法是用array-assignment -

代码语言:javascript
复制
out = np.empty(len(b) + len(idx), dtype=b.dtype)
out[idx] = vals
out[np.isin(np.arange(len(out)), idx, invert=True)] = b

另一种方法是分拣-

代码语言:javascript
复制
sidx = idx.argsort()
out = np.insert(b, idx[sidx] - np.arange(len(idx)), vals[sidx])

请注意,解决方案假定输入为数组。

票数 1
EN

Stack Overflow用户

发布于 2019-10-28 23:19:00

我认为你想做的只是用整数指数掩蔽:

代码语言:javascript
复制
import numpy as np

a = np.random.rand(7)
c = a.copy()
idx = 5, 0

# get the complement of idx
not_idx = np.fromiter((i for i in range(a.size) if i not in idx), dtype=int)
# ...or (mind the final comma: you need a `tuple` of `tuple`s):
not_idx = tuple(i for i in range(a.size) if i not in idx),

# magic
a[not_idx] /= 1.0

# yes!
assert np.all(np.abs(a - c) < 1.0e-10)
# perhaps you would prefer: `np.all(np.isclose(a, c))`?

一种更有效的方法可能是对所有事物执行“魔法”,然后将您想要的未经修改的内容复制回结果,例如:

代码语言:javascript
复制
import numpy as np

a = np.random.rand(7)
c = a.copy()
idx = 5, 0

# magic
a /= 1.0

# copy stuff back
a[idx,] = c[idx,]

# yes!
assert np.all(np.abs(a - c) < 1.0e-10)
票数 1
EN

Stack Overflow用户

发布于 2019-10-29 03:24:28

下面是一种方法,首先对未删除的位进行重新对齐,然后填充已删除的位。诚然,与@Divakar的第一种方法并没有太大的不同,但据我所知,它的速度要快一些:

代码:

代码语言:javascript
复制
import numpy as np
from simple_benchmark import BenchmarkBuilder, MultiArgument

B = BenchmarkBuilder()

@B.add_function()
def pp(b,idx,aidx):
    N,n = b.size,idx.size
    B = np.empty(N+n,b.dtype)
    m = np.ones(N+n,bool)
    m[idx] = False
    B[m] = b
    B[idx] = aidx
    return B

@B.add_function()
def div1(b,idx,vals):
    out = np.empty(len(b)+len(idx),dtype=b.dtype)
    out[idx] = vals
    out[np.isin(np.arange(len(out)),idx, invert=True)] = b
    return out

@B.add_function()
def div2(b,idx,vals):
    sidx = idx.argsort()
    return np.insert(b, idx[sidx]-np.arange(len(idx)), vals[sidx])

@B.add_arguments('array size')
def argument_provider():
    for exp in range(1,13):
        sz = int(2**exp)
        a = np.random.randint(0,100,sz*sz)
        idx = np.random.choice(sz*sz,sz,replace=False)
        b = np.delete(a,idx)
        yield sz*sz,MultiArgument([b,idx,a[idx]])

r = B.run()
r.plot(relative_to=pp)

import pylab
import pathlib
pylab.savefig(pathlib.Path(__file__).stem + '.png')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58598838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档