我有一个numpy数组:
array([], shape=(0, 4), dtype=float64)
如何在多维数组中删除此数组? 我试过了
import numpy as np
if array == []:
np.delete(array)
但是,多维数组仍然有这个空数组。
编辑: 输入是
new_array = [array([], shape=(0, 4), dtype=float64),
array([[-0.97, 0.99, -0.98, -0.93 ],
[-0.97, -0.99, 0.59, -0.93 ],
[-0.97, 0.99, -0.98, -0.93 ],
[ 0.70 , 1, 0.60, 0.65]]), array([[-0.82, 1, 0.61, -0.63],
[ 0.92, -1, 0.77, 0.88],
[ 0.92, -1, 0.77, 0.88],
[ 0.65, -1, 0.73, 0.85]]), array([], shape=(0, 4), dtype=float64)]
删除空数组后的预期输出是:
new array = [array([[-0.97, 0.99, -0.98, -0.93 ],
[-0.97, -0.99, 0.59, -0.93 ],
[-0.97, 0.99, -0.98, -0.93 ],
[ 0.70 , 1, 0.60, 0.65]]),
array([[-0.82, 1, 0.61, -0.63],
[ 0.92, -1, 0.77, 0.88],
[ 0.92, -1, 0.77, 0.88],
[ 0.65, -1, 0.73, 0.85]])]
答案 0 :(得分:2)
new_array
看起来像一个数组列表。即使它是一个数组,它也将是一个dtype = object的1d数组。
==[]
不是检查空数组的方法:
In [10]: x=np.zeros((0,4),float)
In [11]: x
Out[11]: array([], shape=(0, 4), dtype=float64)
In [12]: x==[]
Out[12]: False
In [14]: 0 in x.shape # check if there's a 0 in the shape
Out[14]: True
检查np.delete
的语法。它需要一个数组,一个索引和一个轴,并返回另一个数组。它没有到位。
如果new_array
是一个列表,列表推导可以很好地删除[]
数组:
In [33]: alist=[x, np.ones((2,3)), np.zeros((1,4)),x]
In [34]: alist
Out[34]:
[array([], shape=(0, 4), dtype=float64), array([[ 1., 1., 1.],
[ 1., 1., 1.]]), array([[ 0., 0., 0., 0.]]), array([], shape=(0, 4), dtype=float64)]
In [35]: [y for y in alist if 0 not in y.shape]
Out[35]:
[array([[ 1., 1., 1.],
[ 1., 1., 1.]]), array([[ 0., 0., 0., 0.]])]
如果new_array
是1d数组,它也会起作用:
new_array=np.array(alist)
newer_array = np.array([y for y in new_array if 0 not in y.shape])
要将np.delete
与new_array
一起使用,您必须指定哪些元素:
In [47]: np.delete(new_array,[0,3])
Out[47]:
array([array([[ 1., 1., 1.],
[ 1., 1., 1.]]),
array([[ 0., 0., 0., 0.]])], dtype=object)
找到[0,3]
您可以使用np.where
:
np.delete(new_array,np.where([y.size==0 for y in new_array]))
更好的是,跳过delete
和where
并使用布尔掩码
new_array[np.array([y.size>0 for y in new_array])]
我认为没有一种方法可以在没有列表推导的情况下识别这些'emtpy'数组,因为你必须检查形状或大小属性,而不是元素的数据。还有一个限制,你可以跨对象数组的元素做什么样的数学运算。它更像是一个列表,而不是一个二维数组。
答案 1 :(得分:1)
我最初有一个数组(3,11,11),在使用pool.map进行多处理之后,我的数组被转换成这样的列表:
'use strict';
$scope.posts = posts.posts;
$scope.search = function (row) {
return (angular.lowercase(row.author).indexOf($scope.query || '') !== -1 ||
angular.lowercase(row.title).indexOf($scope.query || '') !== -1 ||
angular.lowercase(row.content).indexOf($scope.query || '') !== -1 ||
angular.lowercase(row.date).indexOf($scope.query || '') !== -1 ||
};
如果在数组中将此列表转换为形状为(3,),那么我使用:
[array([], shape=(0, 11, 11), dtype=float64),
array([[[ 0.35318114, 0.36152024, 0.35572945, 0.34495254, 0.34169853,
0.36553977, 0.34266126, 0.3492261 , 0.3339431 , 0.34759375,
0.33490712],...
并且这返回了我的第一个具有原始形状(3,11,11)的3d数组。
答案 2 :(得分:0)
Delete将多维数组作为参数。然后,您需要指定要删除的子阵列及其所在的轴。见http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html
np.delete(new_array,<obj indicating subarray to delete (perhaps an array of integers in your case)>, 0)
另请注意,删除不是就地。