python numpy.random的基礎教程(附opencv 圖片轉數組、數組轉圖片)

目錄

1.在區間[a,b)隨機生成n個整數。

2.在區間[a,b)隨機生成n個數。

3.在區間[0,1)生成隨機數

4.打亂順序

5.從指定的列表中選擇


NumPy(Numerical Python)是一個開源的科學計算庫,專門用于高效處理多維數組(ndarray)和數值運算。它是 Python 生態中數據科學、機器學習、工程計算等領域的核心工具之一,提供了比原生 Python 列表更高效、更便捷的數組操作能力。

在 NumPy 中,numpy.random?是一個子模塊,專門用于生成偽隨機數(即基于算法生成的、看似隨機但可復現的數值序列)。它提供了豐富的函數,可以生成不同分布的隨機數(如均勻分布、正態分布、泊松分布等),并支持隨機數組的生成、隨機采樣、打亂數據等操作。

1.在區間[a,b)隨機生成n個整數。

np.random.randint

import numpy as np
x = np.random.randint(5, 10, 1)#在[5,10)中隨機生成1個整數
y = np.random.randint(3, 15, 4)#在[3,15)中隨機生成4個整數
print(x)
print(y)
print(type(x))
print(type(x))
z = np.random.randint(5, 10)#在[5,10)中隨機生成1個整數
print(z)
print(type(z))

輸出

[8]
[12 ?7 12 ?9]
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
6
<class 'int'>

可以看到隨機數是numpy數組的格式<class 'numpy.ndarray'>

===========================補充==============================

opencv 讀取的圖片,本質上也是numpy 數組的形式。

對于一個彩色圖像RGB來說,是一個三維的數組。

通過.flatten()可分離為3個一維的數組。

import numpy as np
import cv2#圖片變數組
img = cv2.imread("MN.png")
print(type(img))
print(img.shape)
height, width = img.shape[:2]# 提取三個通道并展平為一維數組
lst1 = img[:, :, 0].flatten()  # Blue 通道
lst2 = img[:, :, 1].flatten()  # Green 通道
lst3 = img[:, :, 2].flatten()  # Red 通道print("Blue 通道 (lst1):", len(lst1))
print("Green 通道 (lst2):", len(lst2))
print("Red 通道 (lst3):", len(lst3))

輸出:

<class 'numpy.ndarray'>
(387, 688, 3)
Blue 通道 (lst1): 266256
Green 通道 (lst2): 266256
Red 通道 (lst3): 266256

當然,數組也能反過來變成圖片

通過np.random.randint隨機生成3個數組,三合1,變成一張彩色圖像。

import numpy as np
import cv2#圖片變數組
img = cv2.imread("MN.png")
print(type(img))
print(img.shape)
height, width = img.shape[:2]# 提取三個通道并展平為一維數組
lst1 = img[:, :, 0].flatten()  # Blue 通道
lst2 = img[:, :, 1].flatten()  # Green 通道
lst3 = img[:, :, 2].flatten()  # Red 通道print("Blue 通道 (lst1):", len(lst1))
print("Green 通道 (lst2):", len(lst2))
print("Red 通道 (lst3):", len(lst3))#數組變圖片
lst4 = np.random.randint(0,256,266256).astype(np.uint8)
lst5 = np.random.randint(0,256,266256).astype(np.uint8)
lst6 = np.random.randint(0,256,266256).astype(np.uint8)
print(lst4.dtype)
blue = lst4.reshape((height, width))
green = lst5.reshape((height, width))
red = lst6.reshape((height, width))
new_img = cv2.merge([blue, green, red])cv2.imshow("Modified Image", new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:

lst4 = np.random.randint(0,256,266256).astype(np.uint8)

np.random.randint中的元素是int32格式,要改為opencv所用的np.uint8格式。

運行后,得到雜亂無章的雪花圖。

=================補充的補充======================

當你有很多張yellow圖,但無法通過審核來發送給你的好兄弟時。

是否可以通過這種方法(圖像轉數組,存入txt,發送。收到后在轉圖像),來實現呢?

代碼中的MN.png(尺寸:(387, 688, 3)):

圖片轉數組并存入txt,代碼如下:

import numpy as np
import cv2#圖片變數組
img = cv2.imread("MN.png")
print(img.shape)
height, width = img.shape[:2]# 提取三個通道并展平為一維數組
lst1 = img[:, :, 0].flatten()  # Blue 通道
lst2 = img[:, :, 1].flatten()  # Green 通道
lst3 = img[:, :, 2].flatten()  # Red 通道# 保存到txt文件(每個通道占一行,空格分隔)
combined = np.array([lst1, lst2, lst3])
np.savetxt("img_data.txt", combined, fmt="%d")

txt中提取數組,并數組轉圖片,代碼如下:

import numpy as np
import cv2
height= 387
width = 688# 讀取文件內容
data = np.loadtxt("img_data.txt", dtype=int)
# 提取三個通道
blue = data[0].reshape(height, width).astype(np.uint8)
green = data[1].reshape(height, width).astype(np.uint8)
red = data[2].reshape(height, width).astype(np.uint8)
new_img = cv2.merge([blue, green, red])cv2.imshow("Modified Image", new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

img_data.txt:

(為什么圖片轉數組后,txt比圖片大這么多。。。)

運行后:非常清晰

完整代碼:

里面放了很多 比較得勁的 img_data.txt ,自己轉了看把? =-=。

通過網盤分享的文件:test_np_cv


鏈接: https://pan.baidu.com/s/1y9YDJWw9xvG6AakM5X4GUA

提取碼: ebtg

==============================================================

2.在區間[a,b)隨機生成n個數。

np.random.uniform

import numpy as np
x = np.random.uniform(5, 10, 1)#在[5,10)中隨機生成1個數
y = np.random.uniform(3, 15, 4)#在[3,15)中隨機生成4個數
print(x)
print(y)
print(type(x))
print(type(x))
z = np.random.uniform(5, 10)#在[5,10)中隨機生成1個數
print(z)
print(type(z))

3.在區間[0,1)生成隨機數

rand 與 randn

import numpy as np# 平均數
def average(lst):sum_lst = 0for n in lst:sum_lst = sum_lst+nreturn sum_lst/len(lst)X = np.random.rand(100)#隨機生成100個數
Y = np.random.randn(100)#隨機生成100個數print(average(X))
print(average(Y))

運行多次后發現,

average(X) = 0.5

average(Y) = 0

rand是[0, 1)?均勻分布隨機數

randn標準正態分布隨機數,范圍是?(-∞, +∞),但大部分值落在?[-3, +3]?之間。

rand 與 randn可用于模擬數據,例如:y = 3x + 4 ,x在[0,3)上的近似數據。

import numpy as np
import matplotlib.pyplot as plt
# 平均數
def average(lst):sum_lst = 0for n in lst:sum_lst = sum_lst+nreturn sum_lst/len(lst)# 生成特征數據 X:100個 [0,3) 區間的均勻分布隨機數
x = 3 * np.random.rand(100)  # np.random.rand生成[0,1)均勻分布,乘以3擴展到[0,3)# 生成目標數據 y:線性關系 y = 4 + 3X + 高斯噪聲
y = 4 + 3 * x + np.random.randn(100)  # np.random.randn生成標準正態分布噪聲# 可視化原始數據
plt.plot(x, y, 'b.')  # 藍色點圖
plt.xlabel('x1')  # x軸標簽
plt.ylabel('y')  # y軸標簽
plt.axis([0, 3, 0, 20])  # 設置坐標范圍:x[0,3], y[0,20]
plt.show()

運行后:

4.打亂順序

shuffle

import numpy as np
lst = [ 1,2,3,4,5,6]
np.random.shuffle(lst)#打亂數組
print(lst)

輸出[4, 2, 1, 5, 6, 3]

====================

在第一節的補充的補充中,數組轉圖片中

打亂一維的數組后,

產生了噪音:

代碼:

import numpy as np
import cv2
height= 387
width = 688# 讀取文件內容
data = np.loadtxt("img_data.txt", dtype=int)
# 提取三個通道
blue = data[0].reshape(height, width).astype(np.uint8)
green = data[1].reshape(height, width).astype(np.uint8)
red = data[2].reshape(height, width).astype(np.uint8)
np.random.shuffle(blue)
new_img = cv2.merge([blue, green, red])cv2.imshow("Modified Image", new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.從指定的列表中選擇

np.random.choice

import numpy as nplst1 = [1,2,3,5,8,9,15,21]
print(np.random.choice(lst1))lst2 = ["一等獎","二等獎","三等獎","謝謝惠顧"]
print(np.random.choice(lst2))

修改各個選項的概率:

import numpy as np
lst2 = ["一等獎","二等獎","三等獎","謝謝惠顧"]
lst2_weight = [0.1, 0.2, 0.3,0.4]
result = np.random.choice(lst2, p=lst2_weight)
print(result)

概率為0.1,0.2,0.3,0.4

動態概率:模擬原神抽卡

lst = ['綠', '班尼特','芭芭拉','七七','刻晴','鐘離']

lst_probabilities = [90 / 100, 4.5 / 100, 4.5 / 100, 0.3 / 100, 0.3 / 100, 0.4 / 100]

不斷抽獎中,隨著count的增加
count += 1

lst_probabilities跟著改變

lst_probabilities = [90 / 100-6*int(count2)/1000, 4.5 / 100, 4.5 / 100, 0.3 / 100+2*int(count2)/1000, 0.3 / 100+2*int(count2)/1000, 0.4 / 100+2*int(count2)/1000]

運行后:

完整代碼
?

import sys
import numpy as np
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,QHBoxLayout, QLineEdit, QPushButton)
from PyQt5.QtCore import Qtclass GachaApp(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle('非酋or歐皇')self.setFixedSize(800, 400)self.count = 0self.count2 = 0self.lst = ['綠', '班尼特', '芭芭拉', '七七', '刻晴', '鐘離']self.lst_probabilities = [90 / 100, 4.5 / 100, 4.5 / 100, 0.3 / 100, 0.3 / 100, 0.4 / 100]self.initUI()def initUI(self):central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout()central_widget.setLayout(main_layout)# 輸入框網格self.input_boxes = []grid_layout = QHBoxLayout()for i in range(10):input_box = QLineEdit()input_box.setAlignment(Qt.AlignCenter)input_box.setFixedSize(60, 60)input_box.setReadOnly(True)self.input_boxes.append(input_box)grid_layout.addWidget(input_box)main_layout.addLayout(grid_layout)# 抽卡按鈕self.gacha_btn = QPushButton('抽卡')self.gacha_btn.setFixedSize(150, 50)self.gacha_btn.clicked.connect(self.gacha)# 計數器self.count_btn = QPushButton("0")self.count_btn.setFixedSize(80, 30)self.count_btn.setEnabled(False)# 重新開始按鈕self.reset_btn = QPushButton('重新開始')self.reset_btn.setFixedSize(100, 30)self.reset_btn.clicked.connect(self.reset)# 按鈕布局btn_layout = QHBoxLayout()btn_layout.addWidget(self.gacha_btn)btn_layout.addWidget(self.count_btn)btn_layout.addWidget(self.reset_btn)main_layout.addLayout(btn_layout)def gacha(self):self.count += 1self.count_btn.setText(f"{self.count}")# 更新概率(根據你的原始邏輯)self.lst_probabilities = [90 / 100 - 3 * self.count2 / 1000,4.5 / 100,4.5 / 100,0.3 / 100 + 1 * self.count2 / 1000,0.3 / 100 + 1 * self.count2 / 1000,0.4 / 100 + 1 * self.count2 / 1000]# 歸一化處理(確保概率總和為1)prob_sum = sum(self.lst_probabilities)self.lst_probabilities = [p / prob_sum for p in self.lst_probabilities]# 抽卡并顯示結果for i in range(10):result = np.random.choice(self.lst, p=self.lst_probabilities)self.input_boxes[i].setText(result)if result in ['七七', '鐘離', '刻晴']:self.show_popup(f"恭喜你 抽到了 {result}")self.count2 = 0else:self.count2 += 1def reset(self):self.count = 0self.count2 = 0self.count_btn.setText(f"{self.count}")for box in self.input_boxes:box.clear()def show_popup(self, message):from PyQt5.QtWidgets import QMessageBoxmsg = QMessageBox()msg.setIcon(QMessageBox.Information)msg.setText(message)msg.setWindowTitle("恭喜")msg.setStandardButtons(QMessageBox.Ok)msg.exec_()if __name__ == '__main__':app = QApplication(sys.argv)ex = GachaApp()ex.show()sys.exit(app.exec_())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96278.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96278.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue2.x核心技術與實戰(二)

目錄 三、Vue2.x:生命周期+工程化開發(組件入門) 3.1 生命周期 3.1.1 生命周期 & 生命周期四個階段 3.1.2 生命周期鉤子 Vue生命周期鉤子案例 - 新聞列表 & 輸入框自動聚焦 3.2 綜合案例:小黑記賬清單 3.3 工程化開發入門 3.3.1 工程化開發 & 腳手架Vue …

【鴻蒙心跡】7×24小時極限求生:當Origin_null遇上鴻蒙,我如何用100杯咖啡換一條跨域活路?

文章概要 大家好&#xff0c;我是那個把黑眼圈熬成華為工牌掛繩的倒霉蛋。過去100個夜晚&#xff0c;我在HarmonyOS NEXT的ArkWeb里被Origin:null反復按在地上摩擦——小程序白屏、OPTIONS 400、官方文檔沉默三連擊。最終&#xff0c;我用C、libcurl、OpenSSL和一堆速溶咖啡&am…

【git】刪除一條本地提交的歷史commit

在工程中&#xff0c;如果想要刪除一條本地提交的歷史commit&#xff0c;可以通過droprebase -i HEAD^n的方式。1.情景提交了三條commit&#xff0c;想刪掉第二條commit。git logcommit_id_*******1 commit_id_*******2 commit_id_*******32.解決git rebase -i HEAD~2輸出&…

軟件測試中,JMeter 的作用以及優缺點是什么?

回答重點JMeter 是一款開源的軟件測試工具&#xff0c;主要用來對各種軟件或服務進行性能測試和負載測試。它可以模擬大量用戶同時對服務器、網絡或其他資源發起請求&#xff0c;從而測試它們的響應時間、吞吐量等性能指標。優點&#xff1a;1&#xff09; 開源且免費 &#xf…

STM32存儲結構

我們在使用Keil編譯程序成功后會,有一行各部分占用內存的提示信息,如下Program Size:Code7492 RO-data556 Rw-data72 ZI-data11688,這是stm32代碼編譯后的提示我們分析一下這個編譯輸出&#xff1a;- Code: 7492字節 -> 代碼部分&#xff08;存放在Flash&#xff09;- RO-da…

手機 瀏覽器調用攝像頭掃描二維碼Quagga

注&#xff1a;需用谷歌瀏覽器才能調用權限1. 引入依賴&#xff1a;npm install ericblade/quagga2<template><el-button color"#188ae2" click"handleScan" class"scan-btn" :disabled"isInitializing || isScanning">{{…

【Oracle篇】偽列之Version Query:全鏈路追蹤行數據變更的所有記錄(不僅僅是被修改的最后時間)(第二篇,總共六篇)

&#x1f4ab;《博主主頁》&#xff1a;    &#x1f50e; CSDN主頁__奈斯DB    &#x1f50e; IF Club社區主頁__奈斯、 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對…

代理模式深度解析:從靜態代理到 Spring AOP 實現

代理模式是軟件開發中一種經典的設計模式&#xff0c;它通過引入 "代理對象" 間接訪問目標對象&#xff0c;從而在不修改目標對象代碼的前提下&#xff0c;實現功能增強&#xff08;如日志記錄、事務管理&#xff09;、權限控制等橫切需求。從簡單的靜態代理到靈活的…

算法 ----- 鏈式

目錄 一 、鏈式 二 、題目 1、兩兩相加 &#xff08;1&#xff09;題目 (3) 代碼書寫 2、兩兩交換鏈表中的節點 &#xff08;1&#xff09;題目 &#xff08;2&#xff09; 解題思路 &#xff08;3&#xff09;代碼書寫 3、重排鏈表 &#xff08;1&#xff09;題目 …

運維監控prometheus+grafana

目錄 一、環境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、驗證、使用 一、環境 系統使用CentOS7虛擬機。 監控三臺服務器&#xff1a; 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …

數字孿生 :提高制造生產力的智能方法

近年來&#xff0c;在先進數字技術深度整合的推動下&#xff0c;制造業經歷了深刻變革。數字孿生技術作為其中最具前景的創新之一&#xff0c;正重塑工廠和生產流程的設計、監控和優化方式。該技術的核心在于為物理資產、系統或流程創建虛擬映射。這種虛擬映射實時同步現實世界…

【論文閱讀】-《SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK》

Sign-OPT: 一種查詢高效的硬標簽對抗攻擊 原文鏈接&#xff1a;https://arxiv.org/pdf/1909.10773 摘要 我們研究在訪問受限情況下評估機器學習系統對抗魯棒性的最實用問題設置&#xff1a;用于生成對抗樣本的硬標簽黑盒攻擊設置&#xff0c;其中允許有限的模型查詢&#xff…

安卓11 12系統修改定制化_____如何去掉 搜狗輸入法 首次運行時權限授權彈窗 其他應用可借鑒

有些內置應用或者第三方應用在首次使用時會跳出權限允許彈窗。雖然這個是系統為了用戶安全設置的一道檢測機制。但無形之中會影響到定制類用戶的使用。那么能不能去除這個首次運行的權限彈窗呢。其實也有多方法可參閱解決。 通過博文了解?????? 1??????-----首次…

雙環模型:一個蘊含安全哲學的類設計解析

雙環模型&#xff1a;一個蘊含安全哲學的類設計解析 在編程世界中&#xff0c;優秀的類設計不僅能實現功能需求&#xff0c;更能體現開發者對系統本質的理解。本文將深入剖析一個看似簡單卻蘊含深刻安全哲學的OP類&#xff0c;探討其雙環模型背后的設計思想與實踐價值。 類結構…

牛津大學xDeepMind 自然語言處理(4)

牛津大學xDeepMind 自然語言處理 Natural Language Processing 語音識別 Speech Recognition語音識別概述 問題定義&#xff1a;自動語音識別&#xff08;ASR&#xff09;、文本到語音合成&#xff08;TTS&#xff09;等相關任務&#xff1a;說話人識別、語音增強、語音分離等語…

MyBatis處理SQL語句映射

基礎MyBatis問題以去看MyBatis基礎。 使用log4j設置日志在控制臺打印SQL語句及其執行信息 也可以使用MyBatis基礎中用的slf4j。 在pom.xml文件中引入log4j坐標依賴 <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><…

嵌入式硬件篇---麥克納姆輪軌跡偏移

麥克納姆輪的軌跡偏移是機械結構、驅動系統、控制邏輯及外部環境等多因素共同作用的結果&#xff0c;其核心是各輪子的驅動力 / 運動狀態無法按理論模型實現協同&#xff0c;導致車體實際運動與期望軌跡產生偏差。以下是具體影響因素的詳細分析&#xff1a;一、機械結構偏差&am…

C語言安全函數分享

在日常寫程序中有一些功能函數是可以重復使用的&#xff0c;在c語言的標準庫里面也有對應的功能函數&#xff0c;但是那些功能函數有會有小問題然后我就整理了一下對應功能的安全函數的使用。其中前四個函數可以編譯成一個動態庫&#xff0c;然后在項目工程中只需要包含對應的頭…

汽車之家聯合HarmonyOS SDK,深度構建鴻蒙生態體系

汽車之家作為一家領先的汽車互聯網公司&#xff0c;致力于打造服務全球的汽車生態科技平臺&#xff0c;覆蓋"看選買用換"的一站式購車體驗。2023年12月底&#xff0c;汽車之家正式啟動鴻蒙開發&#xff0c;并于2024年年底成功構建了完整的鴻蒙生態體系&#xff0c;涵…

深度學習驅動的訂單簿分析與交易策略優化

訂單簿數據特征與預處理方法 高頻金融數據中&#xff0c;訂單簿&#xff08;Order Book&#xff09;承載著市場參與者的實時交易意圖。不同于K線數據的聚合特性&#xff0c;訂單簿數據具有獨特的時空特征&#xff1a; 多維層級結構&#xff1a;包含不同價格檔位的買賣盤深度信息…