Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种内存有效的方法可以将零列和零行插入numpy数组?_Python_Python 3.x_Numpy_Python 3.6 - Fatal编程技术网

Python 是否有一种内存有效的方法可以将零列和零行插入numpy数组?

Python 是否有一种内存有效的方法可以将零列和零行插入numpy数组?,python,python-3.x,numpy,python-3.6,Python,Python 3.x,Numpy,Python 3.6,我有一个大(对称)numpy矩阵arr。它的形状arr.shape=(50\u 000,50\u 000)。我想插入一些零行/列(以对称方式)。假设我要插入的行/列的数量可能是123 小例子 如果我理解正确,那么这段代码将创建数组的副本并一直复制内容 问题: 我想这可能会更简单/更有效?有没有其他方法可以提高效率?如果insert\u cols,我们可以这样做- n = len(insert_cols) out = np.zeros((n,n),arr.dtype) idx = np.flatn

我有一个大(对称)numpy矩阵
arr
。它的形状
arr.shape=(50\u 000,50\u 000)
。我想插入一些零行/列(以对称方式)。假设我要插入的行/列的数量可能是
123

小例子 如果我理解正确,那么这段代码将创建数组的副本并一直复制内容

问题:
我想这可能会更简单/更有效?有没有其他方法可以提高效率?

如果
insert\u cols
,我们可以这样做-

n = len(insert_cols)
out = np.zeros((n,n),arr.dtype)
idx = np.flatnonzero(insert_cols)
out[np.ix_(idx,idx)] = arr # or out[idx[:,None],idx] = arr
或者,使用布尔版本进行索引。因此-

insert_cols_bool = np.asarray(insert_cols, dtype=bool)
然后,使用
insert\u cols\u bool
代替
idx


稀疏矩阵 为了提高内存效率,我们可以将输出存储为稀疏矩阵-

from scipy.sparse import coo_matrix

l = len(idx)
r,c = np.broadcast_to(idx[:,None],(l,l)).ravel(),np.broadcast_to(idx,(l,l)).ravel()
out = coo_matrix((arr.ravel(), (r,c)), shape=(n,n))

以固定大小预分配整个数组是一种选择吗?我已经有过类似的案例,我花了几个小时来解决这个问题:在我的理解中(这是非常基本的,我将在本文后面介绍),使用np.insert或np.concatenate进行有效插入是不可能的。我发现最好的方法是将数组转换为列表,然后插入所需内容,然后将列表重新转换为数组。@MateenUlhaq Yes!预分配确实是可能的,但结果必须是一个新数组(
resize
方法在其功能上非常有限),因此您必须复制源的所有值。我不会重复插入
insert
;太多的新阵列。这看起来好多了-这已经很酷了(+1)。然而,我不确定
out[np.ix(idx,idx)]=arr
的开销。它本质上只在数组上运行一次吗?@Martintoma Well
np.ix(idx,idx)
创建一个二维开放网格,然后索引到
out
数组中,并一步向其中分配
arr
值。
from scipy.sparse import coo_matrix

l = len(idx)
r,c = np.broadcast_to(idx[:,None],(l,l)).ravel(),np.broadcast_to(idx,(l,l)).ravel()
out = coo_matrix((arr.ravel(), (r,c)), shape=(n,n))