前言
这里主要记录numpy遇到的一些问题,目录有点凌乱,日后再做整理
Next:寻找非0元素
问题描述
寻找numpy中非的0元素
问题解决
方法有三种,如下
# 1,返回的是两个adarray,代表了位置索引
a = np.array()
row, col = [i for i in np.nonzero(a)]
nonzero = []
for i, j in zip(row, col):
nonzero.append(a[i, j]) # 位置索引
# 2,直接返回非0的值
a[a!=0]
# 3
where = np.where(a==0)
row, col = [i for i in where]
之后和1一样
Next:扩张与压缩维度
问题描述
想压缩数据的维度,有维度是多余的,如何将他们去掉
问题解决
运用numpy的np.squeeze
函数
a = np.random.random((1,4))
print(a)
b = np.squeeze(a, axis=0)
print(b)
print(b.shape)
# out
[[0.87072838 0.55459801 0.20885144 0.72031326]]
[0.87072838 0.55459801 0.20885144 0.72031326]
(4,)
需要注意的是:
np.squeeze
只能够压缩本来是1维的数据,如果压缩不是1维度的维度则会产生报错- 与
np, squeeze
相反的操作是np.expand_dims
,能够扩张维度。这在pytorch中,相同功能的操作是torch.unsqueeze
Next:数据的重复repeat
问题描述
当我们说重复数据的时候,一般会有两种方式
- 以数据本身一个整体为单位,重复n次,这种操作实际上就是拼接操作
- 复制数据的某一行,或者是某一列,使其重复n次
上述两种操作的实现方法是不同的,第一种操作可以调用numpy的repea
t方法,第二种操作可以写循环用np.concatenate
进行实现
a = np.array([[1,3,4],[4,5,6]])
a
# out
[[1 3 4]
[4 5 6]]
第一种操作的实现,以整体为单位,重复复制n次
# 复制某一行
n = 5
for index in range(n):
concat = np.concatenate([concat, a], axis=0) if index!= 0 else a
print(concat)
# out, a has been concat n times
[[1, 3, 4],
[4, 5, 6],
[1, 3, 4],
[4, 5, 6],
[1, 3, 4],
[4, 5, 6],
[1, 3, 4],
[4, 5, 6],
[1, 3, 4],
[4, 5, 6]]
第二种操作的实现,以某一行或者某一列为单位进行复制,调用repeat函数,调用有两种方式
- 通过函数方式调用,
np.repeat()
- 通过
NumPy.ndarray
对象调用对象方法实现object.repreat()
a = np.array([[1,3,4],[4,5,6]])
np.repeat(a, 2, axis=0)
# 输出
array([[1, 3, 4],
[1, 3