Numpy速通笔记

news2024/7/4 23:40:24

Numpy可以高效处理大数组的数据,因为:

  1. Numpy在一个连续的内存块中存储数据,独立于其他Python内置对象。Numpy是C写的,有优化,比Python内置序列使用的内存少
  2. 可以在整个数组上进行复杂运算,不需要for循环
    下面的代码可以看出,同样的数据量,numpy比原生list快几十倍。
import numpy as np
import time

my_arr = np.arange(1000000)
my_list = list(range(1000000))
start = time.time()
for _ in range(10):
    my_arr = my_arr * 2
end = time.time()
print(end-start) # 0.014997482299804688
start = time.time()
for _ in range(10):
    my_list = [x * 2 for x in my_list]
end = time.time()
print(end-start) # 0.7048995494842529

ndarray

ndarray = n + d(dimension) + array,即N维数组。这个数组里所有元素都是同一类型的,用.dtype可以看到类型。

>>> import numpy as np
>>> data = np.random.randn(2, 3)
>>> print(data)
[[ 0.70162402  0.00711845  0.83315757]
 [-1.1485004   1.19954043 -0.26478855]]
>>> data.shape
(2, 3)
>>> data.dtype
dtype('float64')
print(data * 10) # 每个元素都x10
print(data + data) # 对应位置相加

创建ndarray

# 使用list创建。如果是嵌套的,说明是多维数据
>>> data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
>>> arr2 = np.array(data2)
# 也可以用np.asarray(data2),一样的效果
>>> arr2
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
>>> arr2.ndim
2
>>> arr2.shape
(2, 4)
>>> arr2.dtype
dtype('int32')

# 创建全0数组。创建时需要输入每个维度上的size,多维度的时候要用元组
>>> np.zeros(5)
array([0., 0., 0., 0., 0.])
# 仿照对象的维度创造全0数组
np.zeros_like(对象)

# 创建全1数组
>>> np.ones((2,3))
array([[1., 1., 1.],
       [1., 1., 1.]])
# 仿照对象的维度创造全1数组
>>> np.ones_like(data2)
array([[1, 1, 1, 1],
       [1, 1, 1, 1]])

# empty创建的是没有值的数组,只是分配空间。empty_like()同理
>>> np.empty((2, 3, 1))
array([[[1.],
        [1.],
        [1.]],

       [[1.],
        [1.],
        [1.]]])

# 使用指定值填充所有位置。第一个参数是维度,第二个是指定值。full_like同理
>>> np.full((2,3),4)
array([[4, 4, 4],
       [4, 4, 4]])
>>> np.full_like(data2, 4)
array([[4, 4, 4, 4],
       [4, 4, 4, 4]])
       
# eye和identity都是创造NxN单位矩阵(对角线是1,其余是0)
>>> np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> np.identity(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

# np.arange是range的np版,但是返回的是一个ndarray
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 使用astype可以修改数据类型
>>> arr2.astype(np.float32)
array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]], dtype=float32)

数组运算

大小相等的ndarray之间的任何算术运算都是应用到元素级的,即一一对应操作。比如两个ndarray加减乘除和比较(对应为位置返回True/False)

ndarray与标量之间的算术运算也是元素级的,比如1/arr就是每个元素被1除,arr ** 0.5就是每个元素开方。

通用函数ufunc

就是对ndarray中数据执行元素级运算的函数

ufunc有一个可选参数out,所以可以将out写为ndarray的名字,以实现原地操作。比如 np.sqrt(arr, arr)

np.modf会返回浮点数组的小数和整数部分

>>> arr = np.random.randn(7) * 5
>>> arr
array([ 2.89470277, -7.35643986,  8.69725165, 11.98482889, -6.53072422,
       -3.27780558,  4.71749496])
>>> remainder, whole_part = np.modf(arr)
>>> remainder
array([ 0.89470277, -0.35643986,  0.69725165,  0.98482889, -0.53072422,
       -0.27780558,  0.71749496])
>>> whole_part
array([ 2., -7.,  8., 11., -6., -3.,  4.])

abs/fabs:计算绝对值。对于非复数,使用fabs更快
square/sqrt:平方与开方。开方的时候复数对象会产出nan,报warning但继续执行
exp、log、log10、log2、log1p:最后一个是log(1+x),log是以e为底
sign:计算每个元素的符号,1,0,-1
ceil/floor
rint:四舍五入到最近的整数
isnan:判断是不是nan,返回bool数组,同理isfinite isinf
cos、cosh、sin、sinh、tan、tanh、arccos、arccosh、arcsin、arcsinh、arctan、arctanh

二元:
add、subtract、multiply、divide、floor_divide、power、maximum、fmax(取最大值,但是忽略NaN)、minimum、fmin(取最小只,忽略NaN)、mod、copysign(将第二个数组的符号复制给第一个数组)、greater/greater_equal/less/less_equal/equal/not_equal、logical_and、logical_or、logical_xor

索引与切片

index和切片跟原生List类似,不同的是,切片是“引用”,修改切片会影响到原来的值。如果切片时需要得到副本,应该用arr[5:8].copy()。
默认是引用是因为复制需要消耗内存,而Numpy经常要处理大量的数据,显然复制的消耗太大了。

>>> arr = np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr[5:8]
array([5, 6, 7])
# 使用单一值赋值切片时会“广播”
>>> arr[5:8] = 12
>>> arr
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
# 再取一个切片
>>> d = arr[0:1]
>>> d
array([0])
# 对切片中某个位置赋值
>>> d[0] = -1
# 直接影响原数组,说明是引用
>>> arr
array([-1,  1,  2,  3,  4, 12, 12, 12,  8,  9])

# 二维数组
>>> arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> arr2d[0][2]
3
>>> arr2d[0,2]
3
# 可以一次传入多个切片
>>> arr2d[:2, 1:]
array([[2, 3],
       [5, 6]])

# 如果是用列表切片,表示切特定行
>>> arr2d[[0,2]]
array([[1, 2, 3],
       [7, 8, 9]])
# 如果传入多个列表,就按维度切:
>>> arr2d[[0,2], [0,1]]
array([1, 8])

布尔型切片

# bool切片,除了==还有!=,也可以用 ~(names == 'Bob')
>>> names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
>>> names == 'Bob'
array([ True, False, False,  True, False, False, False])
>>> data
array([[ 0.90597376,  0.48901929, -1.29117936, -0.54704399],
       [ 1.3251687 , -0.97710089,  1.18568268,  0.58076217],
       [ 0.38585117,  0.51111432, -0.36119234, -0.55018491],
       [ 1.23013959, -0.60359478, -0.84073159, -1.03601213],
       [-0.60764054, -0.17980566, -0.10172273,  0.26845593],
       [ 0.4917044 , -0.2176951 ,  0.63413077,  0.17411876],
       [-0.29955537,  0.89073944,  0.27782948,  0.85028906]])
# 可以看到是选取了为True的行作为索引
>>> data[names=='Bob', 2:]
array([[-1.29117936, -0.54704399],
       [-0.84073159, -1.03601213]])
# 可以起个名字。。
>>> cond = names == 'Bob'
>>> data[~cond]
array([[ 1.3251687 , -0.97710089,  1.18568268,  0.58076217],
       [ 0.38585117,  0.51111432, -0.36119234, -0.55018491],
       [-0.60764054, -0.17980566, -0.10172273,  0.26845593],
       [ 0.4917044 , -0.2176951 ,  0.63413077,  0.17411876],
       [-0.29955537,  0.89073944,  0.27782948,  0.85028906]])
# ~cond切的行,1再切列
>>> data[~cond, 1]
array([-0.97710089,  0.51111432, -0.17980566, -0.2176951 ,  0.89073944])
# 组合条件可以使用& |, 不能用and or
>>> mask = (names == 'Bob') | (names == 'Will')

# 将data中所有负值都设为0
>>> data[data < 0] = 0
>>> data
array([[0.90597376, 0.48901929, 0.        , 0.        ],
       [1.3251687 , 0.        , 1.18568268, 0.58076217],
       [0.38585117, 0.51111432, 0.        , 0.        ],
       [1.23013959, 0.        , 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.26845593],
       [0.4917044 , 0.        , 0.63413077, 0.17411876],
       [0.        , 0.89073944, 0.27782948, 0.85028906]])

数组转置和轴对换

二维数组的转置用arr.T,产生新的拷贝

>>> arr = np.arange(15).reshape((3, 5))
>>> arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
# 转置
>>> arr.T
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])
# 或者用transpose,需要输入一个由轴编号组成的元组
# 下面表示把0轴和1轴调换,跟.T的效果一样
arr.transpose(1,0)
arr.transpose((1,0))

还可以用.swaoaxes()方法,需要输入一对轴编号。也是返回视图/引用,不会进行复制。

绘制函数图像

在这里插入图片描述

>>> pts = np.arange(-5,5,0.01)
>>> xs, ys = np.meshgrid(pts, pts)
>>> ys
array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],
       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
       ...,
       [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],
       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],
       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])
>>> xs
array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       ...,
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99]])
>>> z = np.sqrt(xs ** 2 + ys ** 2)
>>> import matplotlib.pyplot as plt
>>> plt.imshow(z);plt.colorbar()
<matplotlib.image.AxesImage object at 0x000001DF26F272B0>
<matplotlib.colorbar.Colorbar object at 0x000001DF2A6D8F40>
>>> plt.show()

数组运算(列表推导)

np.where(条件bool数组,正确时的取值,else时的取值)。后两个参数不一定是数组,也可以是标量值

>>> xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
>>>
>>> yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
>>> cond = np.array([True, False, True, True, False])
>>> np.where(cond, xarr, yarr)
array([1.1, 2.2, 1.3, 1.4, 2.5])

将数组中大于0的值替换为2,否则为-2:

 np.where(arr > 0, 2, -2)

而且,替换值也可以是ndarray,比如如果 np.where(arr > 0, 2, arr)表示,如果某个位置的数值<=0,那么该位置的值就保持不变。

统计

需要注意的是,axis=1计算的是行,axis=0计算的是列

>>> arr = np.random.randn(5, 4)
>>> arr
array([[-0.84075089, -0.75502507,  1.28231228,  0.64605601],
       [-1.0410616 , -0.98069774, -0.44841819,  0.33743376],
       [-0.20403139, -1.73880457, -1.79108436,  1.47435236],
       [-0.36401451,  0.73726505, -0.8924274 , -2.01459786],
       [ 0.26463865,  0.57256931,  0.37323712,  0.91512178]])
# 计算均值
>>> arr.mean()
-0.22339636293037574
>>> np.mean(arr)
-0.22339636293037574
# 计算总和
>>> arr.sum()
-4.4679272586075145
# 注意,axis=1是计算行的,axis=0是计算列的
>>> arr.mean(axis = 1)
array([ 0.08314808, -0.53318594, -0.56489199, -0.63344368,  0.53139172])
>>> arr.sum(axis=1)
array([ 0.33259233, -2.13274377, -2.25956796, -2.53377473,  2.12556687])
>>> arr.sum(axis=0)
array([-2.18521974, -2.16469302, -1.47638054,  1.35836604])

>>> arr = np.array([0,1,2,3,4,5,6,7])
# 计算累加
>>> arr.cumsum()
array([ 0,  1,  3,  6, 10, 15, 21, 28])
>>> arr = np.arange(9).reshape(3,3)
>>> arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
# 列向的累加(竖)
>>> arr.cumsum(axis=0)
array([[ 0,  1,  2],
       [ 3,  5,  7],
       [ 9, 12, 15]])
# 累乘
>>> arr.cumprod(axis=0)
array([[ 0,  1,  2],
       [ 0,  4, 10],
       [ 0, 28, 80]])

std、var、min、max、argmin(最小元素的索引)、argmax(最大元素的索引)
.any()检查是否存在True或者非0元素,.all()检查是否所有都是True或者所有都非0。
bool的True会被当成1,所以可以用sum计算True的个数:

>>> bools = np.array([False, False, True, False, True])
>>> bools.sum()
2

排序

arr.sort()是就地的,默认升序。多维的时候默认是按行,即1,如果按列用0。
np.sort()返回的是副本

>>> arr = np.random.randn(5, 3)
>>> arr
array([[ 0.05913053,  2.46861144, -2.08584111],
       [ 0.69658644, -0.5621056 , -0.12076698],
       [ 0.23630043, -2.56341922, -0.55533511],
       [-0.51205824, -0.17731922, -0.27384838],
       [ 1.22365087,  0.24846602, -1.20284707]])
>>> arr.sort(1)
>>> arr
array([[-2.08584111,  0.05913053,  2.46861144],
       [-0.5621056 , -0.12076698,  0.69658644],
       [-2.56341922, -0.55533511,  0.23630043],
       [-0.51205824, -0.27384838, -0.17731922],
       [-1.20284707,  0.24846602,  1.22365087]])
>>> arr.sort()
>>> arr
array([[-2.08584111,  0.05913053,  2.46861144],
       [-0.5621056 , -0.12076698,  0.69658644],
       [-2.56341922, -0.55533511,  0.23630043],
       [-0.51205824, -0.27384838, -0.17731922],
       [-1.20284707,  0.24846602,  1.22365087]])
>>> arr.sort(0)
>>> arr
array([[-2.56341922, -0.55533511, -0.17731922],
       [-2.08584111, -0.27384838,  0.23630043],
       [-1.20284707, -0.12076698,  0.69658644],
       [-0.5621056 ,  0.05913053,  1.22365087],
       [-0.51205824,  0.24846602,  2.46861144]])

集合

unique(x):类似set,返回结果是有序的
intersect1d(x, y):计算公共元素,返回有序结果
union1d(x, y):并集,有序
in1d(x, y):计算x中每个元素是否属于y
setdiff1d(x, y):x - y
setxor1d(x, y):xor

数据的导入与保存

使用save时,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的。

np.save('xxx', arr)
arr = np.load('xxx.npy')

# 保存多个数组
np.savez('array_archive.npz', a=arr, b=arr)
arch = np.load('array_archive.npz')
b = arch['b']

# 如果希望压缩数据,则
np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)

线性代数

# 矩阵乘法,也可以 x @ y
np.dot(arr.T, arr)

numpy.linalg是线性代数库,跟matlab、R用的是一样的
diag 以1d数组的形式返回方阵的对角线元素,或将1d数组转换为方阵(非对角线为0)
trace 计算对角线元素的和
det 计算矩阵行列式
eig 计算方阵的本征值和本征向量
inv 计算方阵的逆
pinv 计算矩阵的Moore-Penrose伪逆
qr 计算QR分解
svd 计算奇异值分解
solve 解Ax=b,其中A是方阵
lstsq 计算Ax=b的最小二乘解

伪随机数生成

# 设置全局的随机种子
np.random.seed(123)
# 如果想用单独的随机种子,可以创建单独的生成器:
rng = np.random.RandomState(1234)
rng.randn(10)

# 标准正态分布,4x4
samples = np.random.normal(size=(4, 4))
# 等价于: 但是np的会更快
from random import normalvariate
samples = [normalvariate(0, 1) for _ in range(100)]

permutation 返回一个随机排列
shuffle 就地随机排列
rand 产生均匀分布的样本
randint 从给定的范围内随机选取整数
randn 正态分布,mean=0 std=1
beta/chisquare/gamma/uniform/normal/binomial 几种分布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

table的tr动态增加(含html示例)

html页面table的tr动态增加&#xff08;含示例&#xff09; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>简单示例</title><script type"text/javascript">function …

陶建辉在“2023 可信数据库发展大会”发表演讲,TDengine 入选中国数据库产业图谱

当前&#xff0c;全球数字经济加速发展&#xff0c;数据正在成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。数据库作为存储与处理数据的关键技术&#xff0c;在数字经济大浪潮下&#xff0c;全球数据库产业中新技术、新业态、新模式不断涌现。 7 月 4…

mysql创建表练习

CREATE TABLE student ( Id int(10) primary key auto_increment comment "学号", Name varchar(20) not null comment "姓名", Sex enum(M,F) default M comment "性别", Birth year(4) comment "出生年份", Department varchar(20)…

-XX:+PrintCommandLineFlags

-XX:PrintCommandLineFlags把传递给虚拟机的参数输出&#xff08;隐式传递显式传递&#xff09;控制台打印信息-XX:ConcGCThreads3 -XX:G1ConcRefinementThreads13 -XX:GCDrainStackTargetSize64 -XX:InitialHeapSize254884992 -XX:MarkStackSize4194304 -XX:MaxHeapSize407815…

从混沌到秩序的蜕变,SRE解码云计算运维奥秘

什么是SRE SRE&#xff08;Site Reliability Engineering&#xff09;即站点可靠性工程&#xff0c;最初由Google公司提出&#xff0c;通过将开发、运维等多方面进行整合&#xff0c;协同推进系统可靠性&#xff0c;从而确保业务服务能够持久运行。 这是一种新的模式&#xff0…

7.6机试练习

1. 2105 IP Address 描述 Suppose you are reading byte streams from any device, representing IP addresses. Your task is to convert a 32 characters long sequence of ‘1s’ and ‘0s’ (bits) to a dotted decimal format. A dotted decimal format for an IP addres…

视频关键帧AI化的多种方法

视频关键帧AI化的逻辑是将视频切分成一帧帧的画面&#xff0c;然后使用SD绘画固定风格&#xff0c;最后统一在拼接在一起成为一个新的视频。 不管是Mov2Mov还是Multi Frame都能制作这种视频。但是这些操作起来比较麻烦&#xff0c;经过尝试处理较稳定的方法是可以通过img2im的…

Win10电脑开机PIN码怎么取消?

有的用户稀里糊涂的设置了PIN码之后&#xff0c;在开机时发现多了个PIN码&#xff0c;但又不知道电脑PIN码是什么意思&#xff0c;也不清楚开机PIN码怎么取消。您可以通过阅读以下内容&#xff0c;以了解什么是PIN以及如何取消PIN码。 PIN码是一种快捷登录密码方式&#xff0c;…

第九章、vim程序编辑器

9.1 vi与vim 9.1.1 为何要学vim 所有的 Unix Like 系统都会内置 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在&#xff1b; 很多个别软件的编辑接口都会主动调用 vi &#xff08;例如未来会谈到的 crontab, visudo, edquota等指令&#xff09;&#xff1b; vi…

最新版Flink CDC MySQL同步MySQL(一)

1.概述 Flink CDC 是Apache Flink 的一组源连接器&#xff0c;使用变更数据捕获 (CDC) 从不同数据库中获取变更。Apache Flink 的 CDC Connectors集成 Debezium 作为捕获数据更改的引擎。所以它可以充分发挥 Debezium 的能力。 2.支持的连接器 连接器数据库驱动mongodb-cdc…

深度学习神经网络学习笔记-论文研读-transformer及代码复现参考

摘要 优势序列转导模型基于复杂的循环或包括一个编码器和一个解码器的卷积神经网络。最好的表现良好的模型还通过attention 连接编码器和解码器机制。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c; 完全基于注意力机制&#xff0c;省去了递归和卷积完…

在一个呼号前+B1/是啥意思?有人知道吗?

电台呼号有什么意义&#xff1f;呼号指配意义在于&#xff0c;识别各个不同的具体的电台或同一固定电台内使用2个以上频率时&#xff08;包括两个频率&#xff09;来识别每个不同频率&#xff0c;另外电台的类别和性质也取决于其呼号的组成形式&#xff0c;所以呼号一经确定&am…

Mycat2 使用教程(三)原始数据导入分库分表【MySQL分库分库分表】

Mycat2 使用教程&#xff08;三&#xff09;原始数据导入分库分表【MySQL分库分库分表】 本文主要描述mycat2完成分库分别数据源配置后&#xff0c;将数据导入的过程mysql 分库分表如果是新项目&#xff0c;则不用考虑本文内容mycat2如何配置分库分表&#xff1f;见上文 1.计…

排序链表问题

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&#xff1a;…

Hadoop下载安装(物理机)

1、下载Hadoop安装包## http://archive.apache.org/dist/hadoop/common 2、解压安装Hadoop 将hadoop-2-7.4.tar.gz包上传到/root/export/software目录 cd /root/export/software mkdir /root/exprot/servers tar -zxvf hadoop-2.7.4.tar.gz -C /root/export/servers/3、配置…

第三届DeepModeling黑客松竞赛

今年的Hackathon难度梯度设置很广&#xff0c;有偏向硬核开发的&#xff0c;有偏向应用的&#xff0c;还有面向初学者的教学布道赛道&#xff01;欢迎大家来围观&#xff01; 参赛链接

【抽奖实现源码】原生js实现简单九方格抽奖实现(附源码下载)

文章目录 写在前面涉及知识效果图1、搭建抽奖页面2、设置抽奖样式1&#xff09;奖项区块颜色2&#xff09;开始按钮背景色3&#xff09;启动初始块颜色 3、编写抽奖功能4、源码下载1&#xff09; 百度网盘2&#xff09;123云盘 总结 写在前面 之前在一次线下活动大屏上看到一个…

招商银行、江苏银行争相入局AIGC,“老银行”能否讲出“新故事”?

文 | 新熔财经 作者 | 和花 由ChatGPT引发的“大语言模型热潮”还没有过去。 六月&#xff0c;A股市场ChatGPT概念指数入选后股价涨幅超过20%的就超过30支&#xff0c;涨幅超过50%也有将近20支&#xff0c;像昆仑万维、万兴科技、神州泰岳、汤姆猫等公司&#xff0c;更是借着…

Qt扫盲-QMouseEvent 鼠标事件

QMouseEvent 鼠标事件理论 一、概述二、鼠标事件的传递三、组合修饰符四、鼠标坐标位置五、使用方式 一、概述 当在QWidget窗口内的鼠标按钮被按下或释放&#xff0c;或者鼠标光标被移动时&#xff0c;就会发生鼠标事件。 鼠标按下释放没有什么特殊的&#xff0c;但是鼠标移动…

数据可视化利器:五个常见组件助您洞察数据

数据可视化组件是在数据分析展示中我们离不开的工具&#xff0c;可以帮助我们更直观地理解和分析数据。不同的数据可视化组件适用于不同类型的数据&#xff0c;本文介绍五个常见的可视化组件以及它们适合展示的数据类型。 柱状图&#xff08;Bar Chart&#xff09;&#xff1a…