macOSのPowerShellに、PackageManagementでMathNet.Numericsを入れてみた



PowerShellでも、yumやapt-getのようなパッケージ管理システムがあることを知ったので、.NETの数値計算ライブラリーである、MathNet.Numericsを、試しにインストールしてみた。

環境はmacOS 10.13.5、PowerShell v6.0.2。

このサイトや、Microsoftの公式ドキュメントを参考にやってみた。

MathNet.Numericsがヒットしない

まず、yum searchに該当するFind-Packageコマンドレットで、MathNet.Numericsを検索してみたが、見つからない。

> Find-Package -Name MathNet.Numerics                                                                                                         

Find-Package : No match was found for the specified search criteria and package name 'MathNet.Numerics'. Try Get-PackageSource to see all available registered package sources.
At line:1 char:1
+ Find-Package -Name MathNet.Numerics
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Microsoft.Power...ets.FindPackage:FindPackage) [Find-Package], Exception
+ FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage

MathNet.Numericsは、リポジトリーであるNuGetに登録されている。
Get-PackageProviderコマンドレットで確認したところ、NuGetはPackage Providerとして登録されている。

> Get-PackageProvider

Name                     Version          DynamicOptions                                                                                                     
----                     -------          --------------                                                                                                     
NuGet                    2.8.5.210        Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag, Contains, AllowPrereleaseVersions, Con...
PowerShellGet            1.6.0.0          PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, InstallUpdate, NoPathUpdate, AllowPrerel...

Get-PackageSourceコマンドレットで確認したところ、PackageSourceにNuGetがない。

> Get-PackageSource

Name                             ProviderName     IsTrusted  Location
----                             ------------     ---------  --------                                                 
PSGallery                        PowerShellGet    False      https://www.msn.com/ja-jp/?ocid=NEFLS000

そこで、ここに記載のhttps://api.nuget.org/v3/index.jsonを、Register-PackageSourceコマンドレットでPackageSourceとして登録し、再度Find-Packageで検索したが、ダメだった。

> Register-PackageSource -Name "NuGet" -Location "https://api.nuget.org/v3/index.json" -ProviderName "NuGet" 

Name                             ProviderName     IsTrusted  Location 
----                             ------------     ---------  --------
NuGet                            NuGet            False      https://api.nuget.org/v3/index.json

> Find-Package -Name MathNet.Numerics                                                            

Find-Package : No match was found for the specified search criteria and package name 'MathNet.Numerics'. Try Get-PackageSource to see all available registered package sources. 
 At line:1 char:1 
 + Find-Package -Name MathNet.Numerics 
 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 + CategoryInfo          : ObjectNotFound:(Microsoft.Power...ets.FindPackage:FindPackage) [Find-Package], Exception 
 + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage

MathNet.Numericsをヒットさせるまで

ここに解決方法が書いてあった。

どうやらNuGet APIのバージョンがv2でないと駄目なようだ。

 一度、上で登録したPackageSource を、Unregister-PackageSourceで削除してから、v2のURLである、https://www.nuget.org/api/v2/を登録した。
Set-PackageSourceコマンドレットで変更しても、なぜかダメだった。

> Unregister-PackageSource -Name NuGet 

> Register-PackageSource -Name "NuGet" -Location "https://www.nuget.org/api/v2/" -ProviderName "NuGet" 

 これで、無事、Find-Packageコマンドレットで、MathNet.Numericsがヒットするようになった。

> Find-Package -Name MathNet.Numerics 

Name          Version          Source           Summary
----                           -------          ------           -------
MathNet.Numerics               4.5.1            NuGet            Math.NET Numerics is the numerical foundation of the Math.NET project, aiming to provide me...

Register-PackageSourceコマンドレットで登録しなくても、Find-PackageやInstall-Packageの-Sourceオプションで、PackageSourceを指定できる。
このため、Unregister-PackageSourceで削除した。

> Unregister-PackageSource -Name NuGet

 下記のように、-Sourceオプションで指定すれば、Registerされていなくても、ヒットする。

> Find-Package -Name MathNet.Numerics -Source https://www.nuget.org/api/v2/

Name                           Version          Source                           Summary              
----                           -------          ------                           ------- 
MathNet.Numerics               4.5.1            https://www.nuget.org/api/v2/    Math.NET Numerics is the numerical foundation of the Math.NET project, aimi...

なお、当然だが、https://api.nuget.org/v3/index.jsonは、-Sourceオプションに指定してもダメだった。

インストール〜dll読み込み

Install-Packageコマンドレットに、https://www.nuget.org/api/v2/をPackageSourceとして指定し、MathNet.Numericsをインストール。
本当にインストールするか聞かれるので、Yと入力し、Enter。
> Install-Package -Name MathNet.Numerics -Source https://www.nuget.org/api/v2/                                                                  

The package(s) come(s) from a package source that is not marked as trusted.

Are you sure you want to install software from 'https://www.nuget.org/api/v2/'?

[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y

Name                           Version          Source                           Summary 
----                           -------          ------                           -------      
〜依存パッケージのインストール〜
MathNet.Numerics               4.5.1            https://www.nuget.org/api/v2/    Math.NET Numerics is the numerical foundation of the Math.NET project, aimi... 

コンソールに何も出ずに、数分待ったw
初めてInstall-Packageしたから、インストールされていない依存パッケージが多かったからか?

インストールされたので、実際に使用する。
MathNet.Numerics.Statisticsネームスペースの、Statisticsを使用できるか確認したが、

> [MathNet.Numerics.Statistics.Statistics]                                                                                                      

Unable to find type [MathNet.Numerics.Statistics.Statistics].

At line:1 char:1
+ [MathNet.Numerics.Statistics.Statistics]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (MathNet.Numerics.Statistics.Statistics:TypeName) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound

Unable to find typeと出た。
dllファイルを読み込む必要があるようだ。
dllの場所がわからないので、まずはGet-Packageコマンドレットで、MathNet.Numericsパッケージを検索した。

> (Get-Package | Where-Object {$_.Name -eq "MathNet.Numerics"}).Source                                                                       

/usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/MathNet.Numerics.4.5.1.nupkg  

Install-Packageでインストールされたパッケージのデフォルトの格納場所は、/usr/local/share/PackageManagement/NuGet/Packages以下になるようだ。

findでdllを検索してみた。

$ find /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1 | grep dll
/usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/net40/MathNet.Numerics.dll
/usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/net461/MathNet.Numerics.dll
/usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/netstandard1.3/MathNet.Numerics.dll
/usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/netstandard2.0/MathNet.Numerics.dll 

MathNet.Numericsのdllはいくつか見つかったが、とりあえず新しそうな、net461を読み込んだ。

> Add-Type -Path /usr/local/share/PackageManagement/NuGet/Packages/MathNet.Numerics.4.5.1/lib/net461/MathNet.Numerics.dll

再度、MathNet.Numerics.Statisticsネームスペースの、Statisticsを使用できるか確認した。

> [MathNet.Numerics.Statistics.Statistics]

IsPublic IsSerial Name                                     BaseType                                      
-------- -------- ----                                     -------- 
True     False    Statistics                               System.Object

これで、使用できそうだ。

MathNet.Numerics.Statisticsネームスペースの、Statisticsを使ってみた

試しに、StandardDeviationメソッドで、標準偏差を計算してみた。
メソッドの入力として、Double[]型の配列、$arrayを、適当に用意した。

> [Double[]] $array = @(1.0, 2.0, 3.0) 
> [MathNet.Numerics.Statistics.Statistics]::StandardDeviation($array)                                                                           

1

[MathNet.Numerics.Statistics.Statistics]は長すぎるので、

> using namespace MathNet.Numerics.Statistics

上記のように、using namespaceを宣言すれば、[Statistics]::static methodのように使用できる。
下記、平均、中央値、標本分散、母分散の例。

平均
> [Statistics]::Mean($array)
中央値
> [Statistics]::Median($array)
標本分散
> [Statistics]::Variance($array)
母分散        
> [Statistics]::PopulationVariance($array)

下記のように、[MathNet.Numerics.Statistics.Statistics]を変数に格納しても、短縮できる。

> $stat = [MathNet.Numerics.Statistics.Statistics]
> $stat::Mean($array)

これで、PowerShellでいろいろ統計計算できそうだ。
まあ、PowerShellでやる必要はなく、Rとか使えばいいし、そもそも統計を使いこなせてないけど。。

コメント

このブログの人気の投稿

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

Windowsで、特定のユーザーに特定のサービスの再起動を許可する

PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする