NumPy where どの列を調べるか指定する

前回に引き続き、NumPyのちょっと便利な使い方です。

Numpy.where

は配列の中の要素を調べるための有名な関数で、皆さん使ってるかと思います。

標準的な使い方は下記の通りです。

import numpy as np

pieces = np.array([
[1, 0, 0],
[0, 0, 1],
[0, 0, 0]
])

array = np.array([1,0,0])

ndarray = np.where(array == 1, True, False)

print(ndarray)

#下記が出力されます。
[ True False False]

下記のサイトさんなどにも詳しいです。

NumPyで条件に応じた処理を行うwhereの使い方

他のサイトさんであまり紹介されていなくって、今回書いておきたいwhereの使い方が、2次元配列をwhereで調べる時に、列を指定する、というやり方です。

import numpy as np

pieces = np.array([
[1, 0, 0],
[0, 0, 1],
[0, 0, 0]
])

ndarray = np.where(pieces == 1, True, False)[1]

print(ndarray)

#下記が出力されます。
[False False True]

上記のように、whereの後にインデックス[1]をつけると、piecesの2列目(0からカウントなので、1は2番目)が1かどうかを判定して、True, Falseを返してくれてます。

Numpy 2つの配列を比較して重複していない要素を配列にする

前回に引き続き、NumPyについてのちょっと便利な関数を紹介してます。

setdiff1d()

という関数があります。

まずはサンプルです。

import numpy as np

array1 = np.arange(4)
print(array1)

array2 = np.arange(3)
print(array2)

print(np.setdiff1d(array1, array2))

#次のように出力されます
[0 1 2 3]
[0 1 2]
[3]
[0 1 2 3]


[0 1 2]

の差を教えてくれてますね。

ちなみに逆にすると、空の配列が出力されます。

import numpy as np

array1 = np.arange(4)
print(array1)

array2 = np.arange(3)
print(array2)

print(np.setdiff1d(array2, array1))

#次が出力されます。

[0 1 2 3]
[0 1 2]
[]

ちなみに、setdiff1dがあるなら、 setdiff2dがありそうですが、ありません!!

下記のようなやり方でできるようです。(確認はしていません)
https://stackoverflow.com/questions/8317022/get-intersecting-rows-across-two-2d-numpy-arrays

NumPy 0じゃない要素をカウントする

NumPyのことについてこれからちょいちょい書いておこうと思います。

NumPyはNumerical Pythonの略で、データを高密度のデータバッファに格納し、操作を行うための効率的なインターフェース…です。

ディープラーニングをやる上で、numpy使わないことはほぼないと思います。

しかし、今日まで私はNumPyについては

「うーん わからない時にその都度ググればいいかな」

とか思ってたんですが、♪違う違う~ そうじゃなーいー ってことに気が付きました。

っていうのは、次の理由からです。

  • リストなどより、NumPyでデータを扱った方がずっと早い。機械学習などでは、1万回ループするとか普通にありますが、一回のループで1秒遅いと、1万秒遅くなっちゃいます。
  • NumPyでやれることがわかってないと、データの整形とかがうまくできない
  • Pythonについては、意外とまだまだネット上の情報が少ない(日本語)。なので、ググる人のためになるかな~。

そこで、ここではNumPy自身がどう、とかよりも、目的に合わせて、私が便利だな~と思う関数とかを取り上げていこうと思います。

1回目は、ゼロじゃない要素をカウントする、count_nonzero、です。

import numpy as np

np_pieces = np.array([
[1, 0, 0],
[1, 0, 1],
[0, 0, 0]
])

res = np.count_nonzero(np_pieces, axis=0)
print(res)

#次が出力されます。
[2 0 1]
np.count_nonzero(np_pieces, axis =0)

のaxisですが、これは基準にしたい軸の数です。

軸って何?って思いますよね? …。 嫌い…軸……。(ノω・、) ウゥ・・・

とりあえず、2次元配列では、縦が軸が0、横が1です。今回は、np_piecesという配列の、縦方向が0軸で、縦方向に数えていくと、2,0,1、ということです。

何も指定しないと全部通してのゼロじゃない要素を数えてくれます。

import numpy as np

np_pieces = np.array([
[1, 0, 0],
[1, 0, 1],
[0, 0, 0]
])


res = np.count_nonzero(np_pieces)
print(res) 

#次が出力されます。
3

The package name takuru_php is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+

みんな大好きcomposer。

composerはPHPのライブラリの管理ツールです。

公式サイト https://getcomposer.org/

composerはライブラリの依存関係を、composer.jsonというjsonファイルで管理しています。

もちろん、手で書いてもいいんですが、

composer init

とやると、対話形式でこのcomposer.jsonを作ってくれます。

その時に、表示されるエラーがこれ。

The package name takuru_php is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+

ま、よく読めばいいんですが、

「パッケージの名前は、パッケージの名前と、あなたの組織の名前をスラッシュ(バックスラッシュじゃないほう。ギターも弾かないほう)でつないで入れてね。」

というエラーです。

えー、ヤダー、組織の名前なんて入れたくないー。と思っちゃいますが、やらないと、先に進めないのでやりましょう。

たとえば、

hogehoge/all-black-org

とかでいいです。

AndroidManifest.xmlのminSdkVersionを変更しても反映されずビルドできない

さて、ADTのプロジェクトをAndroid Studioへ移す過程ではまったエラー対策の続きです。Android Studioはバージョン3.2.1です。

前回のことがあり、ようやくエラーの原因がわかりました。

C:\Android\takuru\ASdriver1\hogehoge\src\main\AndroidManifest.xml:7:5-74 Error:
uses-sdk:minSdkVersion 11 cannot be smaller than version 14 declared in library [com.google.android.gms:play-services:12.0.1] C:\Users\hogehoge\.gradle\caches\transforms-1\files-1.1\play-services-12.0.1.aar\93010549a0eaa8ce0a656b526c4ad348\AndroidManifest.xml as the library might be using APIs not available in 11
Suggestion: use a compatible library with a minSdk of at most 11,
or increase this project's minSdk version to at least 14,
or use tools:overrideLibrary="com.google.android.gms.play_services" to force usage (may lead to runtime failures)
:takuruDriver:processDebugManifest

 

ご丁寧にもダメなAndroidManifest.xmlへのリンクもあります。

「ほうほう。AndroidManifest.xmlのminSdk指定が悪いのね~ 11じゃなくって14にすればいいんでしょー?!」

っとちゃかちゃか直して、Gradle Sync。

そしたら、Sync Failured.なんですよ。なんで。(´・ω・)

また、プロジェクトをBuild→cleanします。

すると、また下記の同じエラー出てるんですよ。

Error:uses-sdk:minSdkVersion 11 cannot be smaller than version 14.....

ファッ?!ってなって、もう一度、AndroidManifest.xmlを見直したり、キャッシュを消したり、.gradleを消したり。
してみても、結果は一緒でした。。。

なんでAndroidManifest.xmlのminSdkVersionを変更しても反映されないの??と思っていたら、偶然にもAndroidManifest.xmlの下記の部分にマウスオーバーしたら

The minSdkVersion value(14) is not used. it is always overridden by the value specified in the Gradle build script (14) ...

ってメッセージが出てるんですよ。

「…あっ…」

そうですね、プロジェクトのbuild.gradleにもminSdkVersionを書くところがあり、そのほうがAndroidManifest.xmlよりも優先されるのだった。

build.gradleにある下記のminSdkVersionを直して、

android {
    compileSdkVersion 26
    buildToolsVersion '28.0.3'

    defaultConfig {
        applicationId "hogehoge.driver"
        minSdkVersion 14 //これを11から変更
        targetSdkVersion 26
    }
//以下略

AndroidManifest.xmlにあるminSdkVersionは紛らわしいので消します。

すると、やっとBuildが通り、Gradle Syncも成功しました!!( ˊᵕˋ )